我有代碼三塊,我要和目前的工作:通過註冊TLB訪問蟒蛇未註冊的COM對象
- 封閉源代碼的應用程序(MAIN.EXE)
- 封閉源代碼我在Python正在開發的DLL(comobj.dll)實現VB COM對象
- 代碼
comobj.dll主機的COM對象(可以說,「MainInteract」),我想從使用蟒蛇。我已經可以在IronPython中完美地使用這個對象,但由於其他需求,我需要從常規的Python中使用它。我相信這裏最好的方法是使用win32com,但我根本無法取得任何進展。
首先,一些工作IronPython的代碼:
import clr
import os
import sys
__dir__ = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, __dir__)
sys.path.append(r"C:\Path\To\comobj.dll") #This is where the com object dll actually is
clr.AddReferenceToFileAndPath(os.path.join(__dir__, r'comobj_1_1.dll')) #This is the .NET interop assembly that was created automatically via SharpDevelop's COM Inspector
from comobj_1_1 import clsMainInteract
o = clsMainInteract()
o.DoStuff(True)
現在,我試圖在常規的Python代碼:
>>> import win32com.client
>>> win32com.client.Dispatch("{11111111-comobj_guid_i_got_from_com_inspector}")
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 104, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Python26\lib\site-packages\win32com\client\dynamic.py", line 84, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221164, 'Class not registered', None, None)
我已經使用了TLB的友好名稱也試圖:
>>> import win32com.client
>>> win32com.client.Dispatch("Friendly TLB Name I Saw")
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 104, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Python26\lib\site-packages\win32com\client\dynamic.py", line 84, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
其實,我得到的唯一成功是這樣的:
import pythoncom
tlb = pythoncom.LoadRegTypeLib("{11111111-comobj_guid_i_got_from_com_inspector}",1,1,0)
>>> tlb
<PyITypeLib at 0x00AD7D78 with obj at 0x0025EDF0>
>>> tlb.GetDocumentation(1)
(u'clsMainInteract', None, 0, None)
但我不知道如何從那裏去獲得一個對象。我認爲我的問題是我需要將DLL加載到我的進程中,並讓它將自己註冊到進程的COM源,所以我可以正確地使用CoCreateInstance/win32com.client.Dispatch()。
我也看到Activation Contexts被引用,特別是當談到'沒有註冊COM'時,但通常在像「如果你在你的.manifest文件中指定正確的東西,Windows將爲你創建一個上下文」的句子中。如果可能的話,我想避免使用清單文件,因爲在(閉源代碼)COM對象dll所在的文件夾中需要一個文件夾,並且如果我可以避免它,我寧願不刪除任何文件。
感謝您的幫助。
我不知道答案了我的頭頂,但如果你能用C++來做,那麼你可以很簡單地包裝它。 – ConcernedOfTunbridgeWells 2010-06-24 17:46:12
好的,我想這是一個選擇,但我希望避免它。 – 2010-06-24 18:27:41