Mam trzy kawałki kodu, który pracuję w tej chwili z:Dostęp niezarejestrowanych obiektów COM z pytona poprzez zarejestrowanego TLB
- Zamknięty aplikacji źródłowej (main.exe)
- Zamknięty źródło VB obiekt COM wdrożone jako DLL (comobj.dll)
- Kod że Zajmuję się w Pythonie
comobj.dll gospodarzem obiektu COM (powiedzmy, „MainInteract”), że chciałbym skorzystać z Pyton. Mogę już używać tego obiektu perfekcyjnie dobrze z IronPython, ale z powodu innych wymagań muszę go używać ze zwykłego Pythona. Uważam, że najlepszą metodą jest użycie win32com, ale nie mogę w ogóle zrobić żadnego postępu.
Po pierwsze, niektóre pracują kod 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)
A teraz kod, który próbował w regularnych 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)
Mam również próbowali za pomocą przyjazną nazwę 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)
W rzeczywistości, tylko sukces miałem było to:
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)
ale nie jestem pewien, jak go stamtąd do uzyskania obiektu. Myślę, że mój problem polega na tym, że muszę załadować bibliotekę DLL do mojego procesu i zmusić go do zarejestrowania się ze źródłem COM mojego procesu, tak, żebym mógł odpowiednio CureCateateInstance/win32com.client.Dispatch() na nim.
Zauważyłem też, że wymieniono , zwłaszcza gdy mówimy o "braku rejestracji COM", ale zazwyczaj w zdaniach takich jak "Windows stworzy dla ciebie kontekst, jeśli określisz właściwe rzeczy w swoich plikach .manifest". Chciałbym unikać plików manifestu, jeśli to możliwe, ponieważ jeden byłby wymagany w tym samym folderze, co dll obiektu COM (z zamkniętym źródłem), i wolałbym nie upuszczać żadnych plików w tym katalogu, jeśli mogę tego uniknąć.
Dzięki za pomoc.
ja nie znam odpowiedzi wyłączyć mojej głowie, ale jeśli możesz zrób to z C++, a następnie możesz dość banalnie to zawinąć. – ConcernedOfTunbridgeWells
Cóż, tak, sądzę, że jest to opcja, ale miałem nadzieję, że tego uniknę. –