在python中实现COM接口类型库

发布于 2024-11-06 10:42:47 字数 1042 浏览 1 评论 0原文

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

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

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

对此的任何指示将不胜感激。

谢谢

当我尝试运行 Dispatch 来获取 COM 对象时,出现以下异常:

>>>接口 = win32com.client.Dispatch('{68AC7909-804F-4D6D-861C-8382DAA7B029}') 回溯(最近一次调用最后一次): 文件“”,第 1 行,在中 文件“C:\Python26\lib\site-packages\win32com\client\__init__.py”,第 95 行,在 Dispatch 中 调度,用户名=动态._GetGoodDispatchAndUserName(调度,用户名,clsctx) 文件“C:\Python26\Lib\site-packages\win32com\client\dynamic.py”,第 108 行,位于 _GetGoodDispatchAndUserName 返回(_GetGoodDispatch(IDispatch,clsctx),用户名) 文件“C:\Python26\Lib\site-packages\win32com\client\dynamic.py”,第 85 行,位于 _GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) pywintypes.com_error:(-2147221164,'类未注册',无,无)

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

‖放下 2024-11-13 10:42:47

您可以简单地使用 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")

You can simply use win32com.client.Dispatch():

object = win32com.client.Dispatch("Class.Name")

This is the example from ActiveState quick start guide:

>>> import win32com.client
>>> w=win32com.client.Dispatch("Word.Application")
>>> w.Visible=1
>>> w
<win32com.gen_py.Microsoft Word 8.0 Object Library._Application>

If it doesn't work, you can use win32com.client.gencache.EnsureModule() to make sure you've
generated the right cache module.

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)

The same thing with comtypes (simpler and supports custom interfaces)

from comtypes.client import CreateObject
obj = CreateObject("Excel.Application")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文