Обрабатывайте DWORD в Python с помощью ctypes и windll. Указатель в Python? - PullRequest
1 голос
/ 04 августа 2020

В настоящее время я работаю над проектом по управлению внешним устройством с помощью предварительно упакованной библиотеки динамических c ссылок, и я должен сказать, что библиотека ctypes определенно значительно облегчает жизнь! Однако некоторые функции, которые я использовал, импортированные из Delphi, требуют в качестве параметра дескриптор типа DWORD. У меня возникли проблемы при попытке передать целое число в качестве аргумента. В коде Delphi он отлично работает, передавая в качестве аргумента переменную типа longword. Ниже приведены некоторые фрагменты кода:

Определение переменной и передача функции в Delphi. Функция DmxProOpen принимает серийный номер в качестве аргумента и возвращает дескриптор для передачи другим функциям:

function DmxProOpen (cSerNo: pchar; var dHandle: DWORD): integer;
         stdcall; external 'DmxPro.dll'; // function definition in delphi
dLocalHandle : longword;
procedure TForm1.btnOpenClick (Sender: TObject);
const
  SERNO : pchar = 'EN096445';

begin
  lblStatus.Caption:=inttostr( DmxProOpen(SERNO,dLocalHandle) );
end;

вот ошибка в Python:


  File "C:\Users\Labor-Laptop\Desktop\2-ARRI-DOWLIGHT\USB-DMX-DLL\USB-DMX-DLL\Ansteuerung Python.py", line 33, in <module>
    printOpenReturnValue(DLLIMPORT.DmxProOpen(SERNO, dLocalHandle))

OSError: exception: access violation writing 0x0000000000000000

А вот что я пытаюсь сделать:

import ctypes
DLLIMPORT = ctypes.WinDLL("DmxPro.dll")
SERNO= 'EN096445' #Serial number
dLocalHandle= 0
printOpenReturnValue(DLLIMPORT.DmxProOpen(SERNO, dLocalHandle))

Я также пытаюсь импортировать тип DWORD с помощью from ctype import DWORD, но получаю сообщение об ошибке, как показано ниже:

  File "C:\Users\Labor-Laptop\Desktop\2-ARRI-DOWLIGHT\USB-DMX-DLL\USB-DMX-DLL\Ansteuerung Python.py", line 6, in <module>
    from ctypes import DWORD

ImportError: cannot import name 'DWORD' from 'ctypes' (C:\Users\Labor-Laptop\anaconda3\lib\ctypes\__init__.py)

Я очень благодарен за помощь ! Заранее спасибо и хорошего дня! Обновление: я пытаюсь найти способ передать указатель на функцию, но, поскольку я продолжаю смотреть на inte rnet, просто нет способа указать указатель в python. Что я должен делать? Обновление 2: я пробовал c_char_p, а также c_void_p, но не работает:

 printOpenReturnValue(DLLIMPORT.DmxProOpen(SERNO, dLocalHandle))

ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...