只能通过Python部分访问COM类型库

时间:2012-04-23 18:21:49

标签: python com

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

但是,我对COM(pythoncom和win32com)使用Python库感到困惑:

使用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浏览器中,但81个可用的对象中只有4个可以调用Dispatch。其余的回归:

'Class not registered.'

我的问题分为两部分:

1)如何通过COM浏览器和上述调用找到对象,而不能使用win32com.client.Dispatch进行调用? [注意:有问题的申请正在运行。]

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

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

1 个答案:

答案 0 :(得分:0)

只能使用Dispatch直接创建CoClass接口。通常通过向下钻取顶级对象的属性和方法来创建其他接口。如果在类型库上运行makepy,生成的包装器文件将使用注释标记CoClass。