在Python中实现COM接口类型库
我正在尝试创建一个插件,作为我所在公司的一个应用程序的示例。我想用Python来编写这个插件。
这个插件的架构是这样的:插件需要实现一个在提供的COM类型库中定义的接口。所以它是这个类型库的COM客户端,最终会作为COM服务器注册到注册表和应用程序中,方法是通过应用程序提供的ClassID来进行晚绑定。
我使用了pythoncom和win32com,并且用makepy.py从类型库生成了所需的Python代码,但我似乎找不到创建一个实现这个类型库接口的类的方法。
如果能给我一些指点,我将非常感激。
谢谢。
当我尝试运行Dispatch来获取COM对象时,出现了以下异常:
>>> interface = win32com.client.Dispatch('{68AC7909-804F-4D6D-861C-8382DAA7B029}')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:\Python26\Lib\site-packages\win32com\client\dynamic.py", line 108, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Python26\Lib\site-packages\win32com\client\dynamic.py", line 85, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221164, 'Class not registered', None, None)
1 个回答
你可以简单地使用 win32com.client.Dispatch()
来实现:
object = win32com.client.Dispatch("Class.Name")
这是来自ActiveState快速入门指南的一个例子:
>>> import win32com.client
>>> w=win32com.client.Dispatch("Word.Application")
>>> w.Visible=1
>>> w
<win32com.gen_py.Microsoft Word 8.0 Object Library._Application>
如果这个方法不奏效,你可以使用 win32com.client.gencache.EnsureModule()
来确保你生成了正确的缓存模块。
from win32com.client import Dispatch
from win32com.client import gencache
# This comes from running: makepy.py -i "Microsoft Excel 14.0 Object Library"
gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 7)
obj = Dispatch("Excel.Application.14")
# gives <win32com.gen_py.Microsoft Excel 14.0 Object Library._Application instance ...>
print repr(obj)
使用comtypes也是一样的(更简单,并且支持自定义接口)
from comtypes.client import CreateObject
obj = CreateObject("Excel.Application")