在python中实现COM接口类型库

时间:2011-05-11 13:10:38

标签: python com

我有一个插件,我正在尝试创建作为我工作的公司的应用程序的示例。我正在尝试用Python编写这个插件。

插件架构的工作方式是插件需要实现在提供的COM类型库中定义的接口。因此它是该类型库的COM客户端,最后通过为应用程序提供后期绑定COM的ClassID,将其注册为注册表和应用程序的COM服务器。

我正在使用pythoncom和win32com,并使用makepy.py从libarary类型生成所需的python代码,但我似乎无法找到一种方法来创建一个实现该类型库接口的类。 / p>

对此的任何指示都将非常感激。

由于

当我尝试运行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 个答案:

答案 0 :(得分:4)

您只需使用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")