在 Python 中通过 win32com 使用 COM 对象

Posted

技术标签:

【中文标题】在 Python 中通过 win32com 使用 COM 对象【英文标题】:Using COM object in Python with win32com 【发布时间】:2021-06-24 20:39:41 【问题描述】:

我正在尝试使用 win32com.client 从 COM 库中分派一个名为 Signal 的类。不幸的是,我收到了无效类字符串的错误。 COM 库已注册,当在 Visual Basic for Application 中引用时,类 Signal 是可见的并且可以实例化 VBA Signal class 但是,注册编辑器Windows Register Editor 中未明确列出该类 使用 make.py 重新编译 COM 库时,可以在其他类中找到具有其 IID 和接口的类。

是否可以使用类似于 VBA 的 win32client 在 python 中实例化此类?

我尝试通过 IID 分派该类,但没有成功。我可以访问的唯一类是 Windows 注册表编辑器中列出的那些。

我知道问题的描述可能很模糊,但我希望这是众所周知的问题,我在这里缺少一些基础知识。

【问题讨论】:

您通过其 CLSID 而不是 IID 实例化一个类。这可能只是一个误会。对于一种普通的 COM 类,您可以实例化的类将被定义为类型库中的 [coclass],并且类定义通常会列出它实现的默认接口。对于名为“Rock”的示例类,将有一个用于 Rock 的 coclass 定义,并且可能有一个名为 _Rock 或 IRock 的接口。您为 Rock 对象使用 CoCreateInstance(),但查询接口并调用 _Rock 或 IRock 接口上的方法。因此,使用 Python 创建 Signal 类,而不是接口。 IID 用于接口,CLSID 用于对象。这些条款确实被松散地抛出了很多。两者都是 GUID。您创建了一个 Word.Document (CLSID = F4754C9B-64F5-4B40-8AF4-679732AC0607),但收到了 _Document (IID = 0002096B-0000-0000-C000-000000000046 ) 接口并在其上调用方法。跨度> 【参考方案1】:

在花了一些时间之后,我终于发现了问题所在。 我试图实例化的类 Signal 既没有在 x86 也没有在 x64 Windows 注册表中注册,这是一回事,这让我深入研究了类定义的细节。 在 OLE/COM Object Viewer 的帮助下,我发现这个类有属性 [noncreatable],所以它不能被自己实例化。您不能在顶层创建此类的新对象,即通过调用 Win32com.clinet.Dispatch 正在执行的 CreateInstance 或 CoCreateInstance。此类对象的实例化需要对另一个对象进行方法调用。 我从同一个库中实例化了另一个对象并运行它的一个方法,该方法返回一个接口到我需要的类。拥有指向 ISignal 的指针就很容易使用它的所有方法。

谢谢

【讨论】:

以上是关于在 Python 中通过 win32com 使用 COM 对象的主要内容,如果未能解决你的问题,请参考以下文章

在当前进程中通过 python 运行 bat 文件

在 python 中通过 API 对 BigQuery 表进行分区

如何在 Lua 中通过 ESP32 和 NodeMCU 使用蓝牙

在 Python 中使用 win32com.client 文本到语音/语音识别

使用 win32com.client 模块在 Python 中将 .XLSX 转换为 .XLS

Python 使用 win32com 模块对word文件进行操作