如何使用ctypes将Python列表传递给C函数(dll)

8

背景

我有一些用Python编写的分析软件,必须将一个4096字节的列表(看起来像这样 [80, 56, 49, 50, 229, 55, 55, 0, 77, ......])传递给一个dll,以便该dll将其写入设备。

  1. 要写入的字节存储在变量名data中
  2. 必须从Python调用的c函数(在dll中)是

    int _DLL_BUILD_ IO_DataWrite(HANDLE hDevice, unsigned char* p_pBuff, unsigned char p_nByteCntInBuff);

  3. 我无法访问dll代码

尝试的方法

我尝试声明了一个数据类型

data_tx = (ctypes.c_uint8 * len(data))(*data)

并调用该函数
ret = self.sisdll.IO_DataWrite(self.handle, ctypes.byref(data_tx), ctypes.c_uint8(pending_bytes))

问题

没有报错,但是它没有工作。使用 C 和 C++ 调用 API 是可行的。

我是否做得正确?请问有谁可以指出我的错误?


你尝试过定义参数类型吗:IO_DataWrite.argtypes = [c_void_p, POINTER(c_uint8), c_uint8] - David Ranieri
2
通常情况下,我会执行 data_tx = (ctypes.c_uint8 * len(data))(),然后将数据复制到数组中,并使用 ctypes.byref 调用库。你可以尝试这种方法,而不是从数据构建数组。 - Jens Munk
@JensMunk 把它变成一个答案,这就是正确的答案。 - zwol
@zwol 我今天稍后会做。我离开了一段时间。 - Jens Munk
@JensMunk 请把它转换成答案。它是正确的!!!!! - Prajosh Premdas
下班后我会这样做。 - Jens Munk
1个回答

6
你想要做的事情可以像这样完成。
接口头文件,比如functions.h。
#include <stdint.h>
#include "functions_export.h" // Defining FUNCTIONS_API
FUNCTIONS_API int GetSomeData(uint32_t output[32]);

C源代码,functions.c

#include "functions.h"
int GetSomeData(uint32_t output[32]) {
  output[0] = 37;
}

在Python中,你只需写下:
import ctypes
hDLL = ctypes.cdll.LoadLibrary("functions.dll")
output = (ctypes.c_uint32 * 32)()
hDLL.GetSomeData(ctypes.byref(output))
print(output[0])

您应该在屏幕上看到数字37的打印。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接