5

我会尽量保持这个问题尽可能紧凑,但如果我似乎在说疯狂的话,那几乎可以肯定是因为我对某些关键点一无所知,所以请纠正我。


我正在编写一个程序,在 Windows 环境中,它将与具有 COM 接口的现有应用程序交互,以允许第 3 方软件与之交互。

我已经阅读了这个应用程序的所有文档,它说有一个 TLB 文件定义了通过 COM 可用的函数和数据。

如何在 python 中使用 TLB 文件?如何发现应用程序的 progID 以便与它进行交互(文档中没有给出)。

我很迷茫。我有相当多的 Python 经验,但我对在 Windows 环境中进行开发完全陌生。任何帮助都会非常有帮助。我一直在阅读 win32com 上的所有文档,但我仍然不知道该怎么做,因为没有人指出 - 据我所见 - 引入 TLB 文件。

4

2 回答 2

4

提出的问题是将自定义 TLB 文件与要在 python 中开发的 COM 客户端链接。我为我用 C# 开发的 COM 服务器做了一个小示例代码,python 客户端使用“comtypes”包访问了相同的代码。下面的代码片段给出:

    import comtypes.client as CC
    import comtypes

    ccHandle = CC.CreateObject("CSharpServer.InterfaceImplementation")
    print (ccHandle)
    import comtypes.gen.CSharpServer as CS
    InterfaceHandle = ccHandle.QueryInterface(CS.IManagedInterface)

    print ("output of PrintHi function = ", InterfaceHandle.PrintHi("World"))

上述 python 脚本适用于http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx上提供的 C# COM 服务器代码(请参阅文件 1:CSharpServer.cs) .

于 2012-11-20T17:01:19.230 回答
2

好的,我已经有一段时间没有这样做了,无论如何我都不是 COM 专家。阅读Python Programming on Windows 中的 COM 章节,了解如何执行此操作。按照示例(针对 Excel 进行尝试)来了解事情是如何工作的。

首先,如果你还没有安装PyWin32 Extensions 。这是为您pythonwin.exe和 COM 接口模块提供的软件包。从这里得到它。

然后你要从 PythonWin 的工具菜单中打开“COM Makepy Utility”。浏览已注册的 COM 组件列表(一些是类型库,另一些是 DLL),直到确定您拥有的组件(您必须做一些侦探工作)。单击确定以生成 Python 粘合代码。然后,您需要使用-i命令行参数再次运行它以生成样板代码,以便您的 python 脚本可以使用此胶水。下面是对 Microsoft Excel 对象库的 O'Reilly 示例的解释:

import win32com.client

from win32com.client import gencache
gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 2)
earlyBound = win32com.client.Dispatch("Excel.Application")
lateBound = win32com.client.dynamic.Dispatch("Excel.Application")

print earlyBound.ActiveCell()

使用早期绑定对象是可选的,但它确实提高了性能。

找到 ProgID 又是一项侦探工作,尽管这个答案似乎暗示这将很难。尝试使用 RegEdit 浏览注册表的 HKEY_CLASSES_ROOT 配置单元,看看您是否看到看起来很有希望的 ProgID。

于 2012-04-20T21:48:34.363 回答