用ctypes和windl处理Python中的DWORD。Python中的指针?

2024-05-16 03:06:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在进行一个项目,通过一个预打包的动态链接库来控制外部设备,我必须说,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))

我还尝试使用from ctype import DWORD导入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)

我真的很感谢你的帮助!提前谢谢你,祝你有愉快的一天! 更新:我试图找到一种方法来传递一个指向函数的指针,但是当我一直在互联网上寻找时,根本没有办法在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

Tags: 函数inimport类型参数ctypesusbdll