Я пытаюсь дистанционно управлять камерой CCD от Horiba (Symphony) и получил старый SDK. SDK - это просто dll с руководством по функциям в формате pdf. DLL была создана для C#, но все программное обеспечение работает на python. Это dll типа COM и 32-разрядная версия. Я зарегистрировал dll в windows с regsvr32 "C:\Program Files (x86)\Jobin Yvon\Common\JY Components\Detectors\JYMCD\JYCCD.dll"
и создал 32-битную среду conda, в которой я установил pywin32. Затем я последовал этому описанию. Я создал файл pyhton с помощью win32com:
import sys
from win32com.client import makepy
outputFile = r"c:\projectFolder\JYCCD_test.py"
comTypeLibraryOrDLL = r"C:\Program Files (x86)\Jobin Yvon\Common\JY Components\Detectors\JYMCD\JYCCD.dll"
sys.argv = ["makepy", "-o", outputFile, comTypeLibraryOrDLL]
makepy.main ()
В выходном файле есть все функции, описанные в руководстве. Есть 3 класса:
class IJYCCDReqd(DispatchBaseClass):
'IJYCCDRequired Interface'
CLSID = IID('{0D684CA0-9552-4B26-B420-2BEE5BD4F1A0}')
coclass_clsid = IID('{4D7AAEFC-19F9-49B7-A5BB-814933694FD3}')
class _IJYDeviceReqdEvents:
'_IJYDeviceReqdEvents Interface'
CLSID = CLSID_Sink = IID('{A2C81A78-CA13-4A39-8FCB-CD51BD4E9376}')
coclass_clsid = IID('{4D7AAEFC-19F9-49B7-A5BB-814933694FD3}')
_public_methods_ = [] # For COM Server support
_dispid_to_func_ = {
1 : "OnInitialize",
2 : "OnOperationStatus",
3 : "OnUpdate",
4 : "OnCriticalError",
}
class JYMCD(CoClassBaseClass): # A CoClass
# JYMCD Class
CLSID = IID('{4D7AAEFC-19F9-49B7-A5BB-814933694FD3}')
coclass_sources = [
_IJYDeviceReqdEvents,
]
default_source = _IJYDeviceReqdEvents
coclass_interfaces = [
IJYCCDReqd,
]
default_interface = IJYCCDReqd
Я создал новый python файл, в который импортировал этот файл, и хочу инициализировать класс:
import win32com.client
import JYCCD_test
CCD: JYCCD_test.IJYCCDReqd = win32com.client.Dispatch(JYCCD_test.JYMCD.CLSID)
CCD.OpenCommunications()
Pycharm распознает CCD и предлагает также все функции в dll, я просто выбрал OpenCommunications (). Ошибка отсутствует, и программа завершается с Process finished with exit code -1073740771 (0xC000041D)
. Я пытался отладить, но python работает без ошибок. Я отследил проблему до win32com.client.Dispatch(JYCCD_test.JYMCD.CLSID)
. Я что-то делаю не так, или что-то неправильно инициализировано. Также есть USB Dongle, без SDK работать не должно. Должен ли я сначала «установить» или «зарегистрировать» это где-нибудь? Не знаю, как отлаживать код выхода из python. У нас есть более-менее рабочий код C#, но у меня нет опыта работы с C# и там dll загружается в 2 строки (насколько я понимаю).