2011-05-11 91 views
1

我有一個插件,我試圖創建一個作爲我工作的公司的應用程序的示例。我試圖用Python編寫這個插件。在Python中實現COM接口類型庫

插件體系結構的工作方式是插件需要實現在提供的COM類型庫中定義的接口。因此,它是該類型庫的COM客戶端,最後通過爲應用程序爲後期綁定的COM提供ClassID,將其註冊爲註冊表和應用程序的COM服務器。

我正在使用pythoncom和win32com並使用makepy.py從類型libarary生成所需的python代碼,但我似乎無法找到一種方法來創建一個實現此類型庫接口的類。

任何指針,將不勝感激。

感謝

當我試圖運行調度,以獲得COM對象,我得到以下exeption:

>>> interface = win32com.client.Dispatch('{68AC7909-804F-4D6D-861C-8382DAA7B029}') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python26\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx) File "C:\Python26\Lib\site-packages\win32com\client\dynamic.py", line 108, in _GetGoodDispatchAndUserName return (_GetGoodDispatch(IDispatch, clsctx), userName) File "C:\Python26\Lib\site-packages\win32com\client\dynamic.py", line 85, in _GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) pywintypes.com_error: (-2147221164, 'Class not registered', None, None)

回答

4

您可以簡單地使用win32com.client.Dispatch()

object = win32com.client.Dispatch("Class.Name")

這是ActiveState快速入門指南中的示例:

>>> import win32com.client 
>>> w=win32com.client.Dispatch("Word.Application") 
>>> w.Visible=1 
>>> w 
<win32com.gen_py.Microsoft Word 8.0 Object Library._Application> 

如果它不工作,你可以使用win32com.client.gencache.EnsureModule()以確保你 產生正確的緩存模塊。

from win32com.client import Dispatch 
from win32com.client import gencache 

# This comes from running: makepy.py -i "Microsoft Excel 14.0 Object Library" 
gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 7) 
obj = Dispatch("Excel.Application.14") 

# gives <win32com.gen_py.Microsoft Excel 14.0 Object Library._Application instance ...> 
print repr(obj) 

同樣的事情comtypes(簡單,並支持自定義接口)

from comtypes.client import CreateObject 
obj = CreateObject("Excel.Application") 
+0

是的,我做了嘗試,並且我得到:pywintypes.com_error:(-2147221164, '類沒有註冊',無,無) – Caleb 2011-05-11 13:34:14

+0

@Caleb:你得到了而不是?在這種情況下,你應該使用'win32com.gencache.EnsureModule()'。 makepy告訴你應該寫出確切的行。查看我的編輯例子。 – 2011-05-11 13:36:07

+0

順便說一下,你的COM接口是否真的支持調度(即,它是否可以從VB6/VBScript/etc訪問)?如果沒有,你不能使用win32com - 你必須使用comtypes。或者,也許你會想要使用[comtypes](http://starship.python.net/crew/theller/comtypes/),因爲它的API比win32com好一點。 – 2011-05-11 13:43:45