【问题标题】:Using a TLB-defined interface with Python and COM在 Python 和 COM 中使用 TLB 定义的接口
【发布时间】:2012-04-16 18:08:19
【问题描述】:

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


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

我已阅读此应用程序的所有文档,其中说有一个 TLB 文件定义了可通过 COM 获得的功能和数据。

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

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

【问题讨论】:

    标签: python com


    【解决方案1】:

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

        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 脚本用于 C# COM 服务器代码,可在 http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx 获得(参考文件 1:CSharpServer.cs)。

    【讨论】:

      【解决方案2】:

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

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

      然后,您将从 PythonWin 的工具菜单中打开“COM Makepy 实用程序”。浏览已注册的 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 又是一项侦探工作,尽管this answer 似乎暗示这将很难。尝试使用 RegEdit 浏览注册表的 HKEY_CLASSES_ROOT 配置单元,看看您是否看到一个看起来很有希望的 ProgID。

      【讨论】:

      • 另外,如果 COM 对象支持 IDispatch 接口,则只能使用 win32com(它可能支持,因为这就是您使用 VB 与它交谈的方式)。如果是自定义 COM 接口,请查看 comtypes (starship.python.net/crew/theller/comtypes)。
      • 我会检查 comtypes,因为这可能会有所帮助。你介意看看我发布的第二个问题吗?我能够学到更多东西,并且大大缩小了我的问题范围。我真的很感谢你的帮助,我已经反对这个好几天了。 stackoverflow.com/questions/10286071/…
      • 我已经按照您的建议和 O'Reilly 中的详细说明完成了整个 MakePy 过程。这似乎绝对是要走的路,但现在我一直在寻找 ProgID 用作 Dispatch 的参数。我想这就是进步!
      • 查看其他一些 COM 文档,看起来您可以使用 GUID 而不是 ProgID 作为 Dispatch 的参数。我忘了我在哪里看到的,否则我会链接到它。
      猜你喜欢
      • 1970-01-01
      • 2014-09-08
      • 2016-01-04
      • 1970-01-01
      • 2010-12-03
      • 2015-05-02
      • 2018-08-30
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多