Google Desktop带有一个SideBar,一直没有装过,因为觉得Google的桌面搜索太占空间。这回Zoomq告诉我Google Desktop 可以使用Python来开发,于是乎,对SideBar的开发感起兴趣来。上到 http://desktop.google.com 上面只有中文1.0版,后来发现在右下角有一个英文的链接,点击进去后发现英文版本的才有2.0Beta版可以下载。于是下载,安装了。连Google Talk也自动排在其中了。在 http://desktop.google.com/plugins/ 有SDK的文档和示例代码可以下载。下载后打开看了半天也没看到哪里可以使用 Python, 后来才发现开发Plugin需要使用Com编码,因此Google建议使用VS开发平台,但 Python 也的确是一种支持Com开发的语言。看来如果想开发 SideBar 的插件的话,需要学习Com。而Com本身是一项挺复杂的东西,什么接口了,而我的确没有怎么学过。为了研究插件的开发,我学起了 Python Com 编码。主要的资料是《Python Programming On Win32》,这本书的作者之一Mark Hammond就是win32com的开发者,也是PythonWin的开发者,因此很有权威。经过几天的学习已经大致明白了,以前对于Com的难以理解的东西,在经过Python封装后已经变得很简单了。

后来又发现一个收集有关Python 在Windows下编程的网站,发现有一些Com编程的资源,大家有兴趣可以看一看如何在 Python 下调用Windows的应用程序。

下面是一段可以使用 Windows Media Player 来播放音乐的代码,大家可以马上在交互环境下试验,当然前提是你需要安装 PythonWin32 包,现在最新的是204版。

代码如下:

>>> from win32com.client import Dispatch
>>> mp = Dispatch("WMPlayer.OCX")
>>> tune = mp.newMedia("C:/WINDOWS/system32/oobe/images/title.wma")
>>> mp.currentPlaylist.appendItem(tune)
>>> mp.controls.play()

很简单吧。如果想停止可以执行:

>>> mp.controls.stop()

Python 的 Com 编程主要包括两个方面:客户端和服务器。

客户端是用来调用其它的 Com 对象,因此从上面第一行可以看到client,就知道这是客户端编程。如果要编服务器的程序则需要从win32com.server来导入了。Dispatch是用来获得 Com 对象的方法。为什么叫Dispatch呢?因为在 Com 有一个接口叫 IDispatch ,它是一个高层接口,主要可以实现方法和属性的动态获取。也就是说,当你得到一个Com对象后你并不知道它的方法和属性都有些什么,而是动态获取的。所有实现IDispatch的对象需要实现两个方法:GetIDsOfNames()和Invoke()。GetIDsOfNames用来查找一个方法或属性是否存在,如果存在则返回它的一个数字索引,然后要使用这个索引传入Invoke来进行调用。从上面的代码你看不到这样的处理,因为 Python 自动给你完成了。所以使用 Python 写 Com 的程序真是方便啊。因此后面对于对象的操作都是自动进行GetIDsOfNames()和Invoke()进行调用了。这在Com中可以称之为后联编,也就是后期绑下。同时 Python 也支持前联编也就是前期绑定。如果想使用这种方法,需要执行MakePy.py这个程序。它会让你选择要处理的COM对象,然后生成一个python程序,用来处理前期绑定。前期绑定则不再需要动态获取了,因此它可以提高运行速度,同时还可以处理常量,而在后期绑定是处理不了的。这些细节在上面的书中都有讲述。

服务器的开发要复杂多了,这个以后再说吧。


11条评论

  1. limodou,你好,对你已是仰慕已久,很敬佩你严谨的工作态度和与大家分享的精神!虽然我不是学python的,但还是从你的blog中收获很多。

    最近这两天我看了你的“Docbook学习”,受益匪浅,这篇文档把我带入了门,现在我已经基本能编写docbook文档了!在学习的过程中,对你的文档也有一些建议和疑问,我都写在下面了,我也希望你的这篇文档能更加完美,带给更多的人快乐!

    针对最新1.6.5版:

    1、http://pyrecord.freezope.org/docbook/index.html这页版权声明可以改为2005了

    2、在一些章节安排上如果调整一下,也许更清晰。

    3、1.1节和1.2节分别命名为单文档和多文档会不会更清楚一点?另外能不能多讲一点book和article的差别之类的?

    4、一开始你说“DocBook是什么?有什么用?我不想在这方面过多分地叙述了。”其实我觉得还是说一点为好,简单的一节就可以了,让大家有一个感性的认识,觉得它是个好东西,这样学起来也会兴趣大增。

    5、http://pyrecord.freezope.org/docbook/bookstructure.html的第2点注释中“(参考???)”是不是有误?

    6、http://pyrecord.freezope.org/docbook/mulitfiles.html的第3点注释中“后面跟着逗号(;)”应该是“分号”。

    7、http://pyrecord.freezope.org/docbook/ch02s02.html中“在entity名entities前有一个分号”应为“百分号”,这部分应该可以把SYSTEM和PUBLIC讲一下。

    8、http://pyrecord.freezope.org/docbook/ch02s04.html可以说一下现在DocBook DTD 5.0还没有出来。

    9、http://pyrecord.freezope.org/docbook/ch02s06.html能不能在下面显示一下效果,我觉得好像与一般的文本没什么不同?

    10、还有好像应该说明一下xml文件里的空格问题,有的xml编辑器(我用的是eclipse中的一个插件)能够格式化,会自动加入空格和tab,这个好像会影响html的输出效果。

    11、http://pyrecord.freezope.org/docbook/ch02s15.html好像应该说得更详细一些,就像我一开始看这里,就没怎么理解,后来才知道在外面是用glossary,在appendix中是用glossentry。

    12、http://pyrecord.freezope.org/docbook/ch02s16.html你说“不过如果警告是以图形方式显示的,则标题不会显示出来”,我试验得好像标题也能显示出来,和内容并列上下两行。

    13、我的环境设置已经成功,你的这页http://pyrecord.freezope.org/docbook/translate_html.html有些版本已经升级了,应该可以更新一下了,比如jdk1.5,saxon6.5.4,xsl-1.69.1,xml-4.5b1。

    14、还是这页中,我觉得让初学者使用catalog好像不是太容易理解,还不如直接让他用本机的file:///…dtd,反正也是在自己机子上用,再说也可以用相对目录。这样你的build.bat文件内容就可以少很多,容易理解一些:

    java -classpath f:\saxon\saxon.jar;f:\docbook\docbook-xsl\extensions\saxon653.jar com.icl.saxon.StyleSheet -o f:\docbook\rob\index.html f:\docbook\rob\index.xml f:\docbook\docbook-xsl\html\docbook.xsl

    15、http://pyrecord.freezope.org/docbook/ch03s04.html中你的源代码怎么用docbook.xsl格式输出不行,我想试试就在一页显示。

    16、http://pyrecord.freezope.org/docbook/ch03s06.html输出的html文件都是iso-8859-1编码的,能不能改成别的呢?

    17、http://pyrecord.freezope.org/docbook/ch03s07.html中xmlspy还是很方便的,应该推荐这个,可以进行语义检查。

    18、http://pyrecord.freezope.org/docbook/ch02s15.html#sect.2.15.1中“O’Reilly & Associates, Inc.”还是用“&”吧。

    19、http://pyrecord.freezope.org/docbook/apc.html“常用术语”太少了,感觉这页像在凑数。

    20、我还有个建议,能不能设计个好一点的css,我总觉得这样写出来的文档太单调了,在UI上没什么吸引力。

    我没有找到你的email,只有贸然在你的blog上留贴了。

  2. 非常感谢你的说明。在我学完DocBook之后一直没有机会使用它了,因此我的这个教程也只是一个阶段的学习心得,许多东西已经好久没有碰过了。看到你提到这么多的问题感到很惭愧,而且对你的细心深表感谢。有些东西在我写的时候(这个教程也有些时日了)还没有什么新东西,而且在的确有许多变化,看来是有必要修改修改了。那么有些东西能否帮助我补充呢?有些东西我已经有些记不清了,重新拾起来也需要花时间的。不知是否有这个兴趣。

  3. 我的水平可能现在只能改改你文章中的笔误,其他的这些建议我只能提出供你参考,我可没有那个水平去修改:)

    而且我学这个的时间还太短,很多自己还不是很理解,给你提出的建议也许都是错误的。

    不过你要真的没有时间再维护这份文档的话,那我就先慢慢边学习边修改,然后提交给你审查。

    另外你有其他的联系方式吗,还是我就在你的blog上留言?

  4. to HD:

    没太仔细看过activePython,因为作者也都是一样的。我使用的也是Mark开发的包。只不过active python是否有它自已的扩展。

  5. to 老康:

    有任务才会有动力。你如果可以修改,可以在我的源代码上进行,把你的信息加上。然后传给我,我会进行比较的。最近的确是比较忙,不过尽量抽空进行修改,至少小问题可以修改。如果你可以做我是非常感谢的。因为这要占用你的时间了。

    在blog就行,想发邮件可以chatme@263.net。

  6. 好的。

  7. http://www.activestate.com/Products/ActivePython/?mp=1

    active python是一个对com支持很好的package :)

  8. 能不能多加一些你做过的例子,复杂一点的

  9. 你是说com吗?我才学。上面我介绍的网站有许多的例子。

  10. limodou兄弟好,

    我碰到一个问题,请教一下。

    一般的com应用似乎都很简单,特别是www.win32com.de网站上给出的例子,比如CATIA,AutoCAD都能正常工作。但是我碰到这样的怪事,

    从makepy里面选择某一个com type library 生成的**.py文件(是client端的wrapper),没法正常使用。里面代码看似没有问题。但是总是会报member not found的错误。

    该com type library 在 VB和CBuilder里面可以正常使用。

    我用makepy测试了其他的一些com library,都可以使用。所以原因很可能是python和win32com对com的支持并不完备,特别是对不支持IDispatch的用户自定义接口。我正在看win32com里面的所有例子和源代码,希望能找到一些线索。

    有兴趣的朋友可以到www.visualcomponents.com网站申请这个程序(3DCreate)的光盘,提供了外部调用com接口。

  11. 不要再想了,COM有许多的接口,目前python中的win32包只支持IDispatch的接口。

发表评论

评论也有版权!