在python中实现COM接口类型库
我有一个插件,我正在尝试为我工作的公司的应用程序创建一个示例。我正在尝试用 Python 编写这个插件。
插件架构的工作方式是插件需要实现在提供的 COM 类型库中定义的接口。因此,它是该类型库的 COM 客户端,并最终通过应用程序为其提供后期绑定 COM 的 ClassID,将其注册为注册表和应用程序的 COM 服务器。
我正在使用 pythoncom 和 win32com 并使用 makepy.py 从类型库生成所需的 python 代码,但我似乎找不到一种方法来创建一个实现该类型库接口的类。
对此的任何指示将不胜感激。
谢谢
当我尝试运行 Dispatch 来获取 COM 对象时,出现以下异常:
>>>接口 = win32com.client.Dispatch('{68AC7909-804F-4D6D-861C-8382DAA7B029}') 回溯(最近一次调用最后一次): 文件“
I have a plugin that I'm trying to create as a sample for an application from the company I work for. I'm trying to write this plugin in Python.
The way the plugin architecture works is that the plugin needs to implement an interface defined in a provided COM type library. So it is a COM client to that type library and in the end gets registered as a COM Server to the registry and the application by giving it the ClassID for late-bound COM by the application.
I'm using pythoncom and win32com and have used makepy.py to generate the needed python code from the type libarary but I can't seem to find a way to create a class that implements the interface from this type library.
Any pointers on this would be greatly appreciated.
Thanks
When I try to run Dispatch to get the COM object I get the following exeption:
>>> 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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以简单地使用
win32com.client.Dispatch()
:object = win32com.client.Dispatch("Class.Name")
这是 ActiveState 快速入门指南中的示例:
如果它不起作用,您可以使用
win32com.client.gencache.EnsureModule()
来确保您已生成了正确的缓存模块。
与 comtypes 相同(更简单并且支持自定义接口)
You can simply use
win32com.client.Dispatch()
:object = win32com.client.Dispatch("Class.Name")
This is the example from ActiveState quick start guide:
If it doesn't work, you can use
win32com.client.gencache.EnsureModule()
to make sure you'vegenerated the right cache module.
The same thing with comtypes (simpler and supports custom interfaces)