2012-04-16 113 views
4

我會盡量保持這個問題儘可能緊,但是如果看起來我說的是瘋狂的事情,那幾乎肯定是因爲我對一些關鍵點無知,所以請糾正我。使用TLB定義的接口與Python和COM


我寫一個程序,在Windows環境中,將與具有COM接口,允許第三方軟件來與它進行交互現有的應用程序界面。

我已閱讀此應用程序的所有文檔,它說有一個TLB文件定義通過COM可用的功能和數據。

如何在python中使用TLB文件?如何發現應用程序的progID,以便我可以與它進行交互(這不在文檔中給出)。

我很迷路。我對Python有相當豐富的經驗,但對於在Windows環境中開發,我是全新的。任何幫助都將非常有幫助。我一直在閱讀關於win32com的所有文檔,但我仍然不知道該怎麼做,因爲沒有人介紹 - 就我所見 - 引入TLB文件。

回答

1

好吧,我已經做了一段時間了,而且我不是任何方式的COM專家。閱讀the COM chapter from Python Programming on Windows看看如何做到這一點。跟隨示例(嘗試與Excel對抗)以瞭解事情的工作方式。

首先,安裝PyWin32擴展如果你還沒有。這是爲您提供pythonwin.exe和COM接口模塊的軟件包。從here獲取它。

然後你打算從PythonWin的工具菜單中打開「COM Makepy Utility」。瀏覽已註冊的COM組件列表(其中一些將是typelib,其他DLL),直到找到你所擁有的一個(你必須做一些偵探工作)。單擊確定以生成Python膠水代碼。然後您需要使用-i命令行參數重新運行它,以生成樣板代碼,以便您的python腳本可以使用此粘合劑。下面是O'Reilly的例子對Microsoft Excel對象庫意譯:

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。

+0

此外,如果COM對象支持IDispatch接口(它可能會這樣做,因爲這就是使用VB進行交流的方式),所以只能使用win32com。如果它是一個自定義COM接口,請查看comtypes(http://starship.python.net/crew/theller/comtypes/)。 – 2012-04-20 21:53:13

+1

我會檢查出comtypes,因爲這可能有幫助。你介意看看我發佈的第二個問題嗎?我能夠更多地學習,並大大縮小了我的問題範圍。我真的很感謝你的幫助,我一直在反對這個問題。 http://stackoverflow.com/questions/10286071/only-partial-access-to-a-com-type-library-through-python – user1336958 2012-04-23 18:24:43

+0

我已經經歷了整個MakePy過程,正如你所建議的那樣,並且在O'賴利。這絕對是要走的路,但現在我堅持找到ProgID用作Dispatch的參數。我想這是進步! – user1336958 2012-04-23 19:16:32

3

提出的問題是將自定義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腳本是用於C#COM服務器可在http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx代碼(參考文件1:CSharpServer.cs)。