【问题标题】:Only partial access to a COM Type Library through Python通过 Python 只能部分访问 COM 类型库
【发布时间】:2012-05-04 09:22:50
【问题描述】:

我正在尝试编写一些脚本来使用应用程序附带的 COM 类型库来从外部控制它。

但是,我一直在使用用于 COM 的 Python 库(pythoncom 和 win32com):

使用 COM 浏览器,我可以导航以找到我有兴趣使用的类型库的 GUID。

使用 pythoncom,我可以轻松浏览此类型库以查看可用的对象。

>>> import win32com.client
>>> import pythoncom
>>> type_lib_iid = '{12345678-ABCD-EFGH-1234-12341234}'
>>> lib = pythoncom.LoadTypeLib(type_lib_iid, 1, 0)
>>> for index in range(0, lib.GetTypeInfoCount()):
        print lib.GetDocumentation(index)[0]
        print lib.GetTypeInfo(index).GetTypeAttr().iid

这会返回所有可用 COM 对象的 GUID(对不起,如果我正在扼杀这个词汇表)。

奇怪的是,当我浏览类型库时,此调用返回的所有对象都出现在 COM 浏览器中,但我可以调用 Dispatch 的 81 个可用对象中的 4 个。其余返回:

'Class not registered.'

我的问题分为两部分:

1) 对象怎么可能既可以通过 COM 浏览器也可以通过上述调用找到,而不能使用 win32com.client.Dispatch 调用? [注意:有问题的应用程序正在运行。]

2) 我是否使用了错误的功能?派送不正确吗?我坦率地承认,我发现 Python COM 模块的文档令人困惑,但我没有找到任何未调度现有 COM 对象的示例,因此我不知道从哪里开始。此外,可以分派的 4 个对象似乎完全按照文档中的说明工作。

[最后一点:如果我尝试 pythoncom.CoCreateInstance(TypeLibCLSID, None, 1, GUIDofInterfaceObject) 我得到“不支持接口。”我需要使用的关键接口是我在这里尝试的 GUID。]

【问题讨论】:

    标签: python com


    【解决方案1】:

    只有 CoClass 接口可以直接使用 Dispatch 创建。其他接口通常是通过深入了解顶级对象的属性和方法来创建的。如果你在你的 typelib 上运行 makepy,生成的 wrapper 文件将用注释标记 CoClass。

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2021-01-04
      • 2013-11-15
      • 2016-08-09
      • 1970-01-01
      • 2013-01-13
      • 2019-09-07
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多