使用TLB定义的接口与Python和COM

时间:2012-04-16 18:08:19

标签: python com

我会尽量保持这个问题的严密性,但如果看起来我说的是疯狂的事情,那几乎可以肯定是因为我对一些关键点一无所知,所以请纠正我。


我正在Windows环境中编写一个程序,该程序将与具有COM接口的现有应用程序连接,以允许第三方软件与其进行交互。

我已经阅读了该应用程序的所有文档,并且它说有一个TLB文件定义了COM提供的功能和数据。

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

我很丢失。我对Python有相当多的经验,但我完全不熟悉在Windows环境中开发。任何帮助都会非常有帮助。我一直在阅读关于win32com的所有文档,但我仍然不知道该怎么做,因为没有人解决 - 就我所见 - 引入一个TLB文件。

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:2)

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

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

然后,您将从PythonWin的“工具”菜单中打开“COM Makepy Utility”。浏览已注册的COM组件列表(有些将是类型库,其他DLL),直到找到您拥有的组件(您必须做一些侦探工作)。单击“确定”以生成Python粘合代码。然后,您需要使用-i命令行argmument再次运行它以生成样板代码,以便您的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再次是一些侦探工作,虽然this answer似乎意味着它会变得很难。尝试使用RegEdit在注册表的HKEY_CLASSES_ROOT配置单元中查看是否看到看起来很有希望的ProgID。