【问题标题】:implement COM interface type library in python在python中实现COM接口类型库
【发布时间】:2011-08-23 07:35:13
【问题描述】:

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

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

我正在使用 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)

【问题讨论】:

    标签: python com


    【解决方案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")
    

    【讨论】:

    • 是的,我确实尝试过,我得到:pywintypes.com_error: (-2147221164, 'Class not registered', None, None)
    • @Caleb:你得到的是 而不是 ?在这种情况下,您应该使用win32com.gencache.EnsureModule()。 makepy 告诉你应该写的确切行。以我的编辑为例。
    • 顺便说一句,你的 com 接口真的支持调度吗(即,它是否可以从 VB6/VBScript/等访问)?如果没有,你不能使用 win32com - 你必须使用 comtypes。或者你可能还是想使用comtypes,因为它的 API 比 win32com 好一点。
    • 我不确定。如果IDispatch 没有出现在.IDL 中是否意味着它不支持IDispatch?抱歉,我无权访问生成类型库的代码。
    • @Caleb:是的,IDL 中定义的接口应该继承自 IDispatch。如果没有,您将无法从 win32com 使用它们。
    猜你喜欢
    • 2013-02-26
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多