Как отлаживать dll COM-типа в python, реализованном с помощью python пакета pywin32 - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь дистанционно управлять камерой 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 строки (насколько я понимаю).

...