2015-09-18 295 views
5

背景如何Python列表传递给C函数(DLL)使用ctypes的

我有一些分析软件在Python我必须通过的4096个字节的列表(它看起来像这样[80, 56, 49, 50, 229, 55, 55, 0, 77, ......])到dll,以便将dll写入设备。

  1. 要写入的字节被存储在变量名数据
  2. 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)) 

问题

似乎没有错误,但它不工作。 API调用与C和C++一起使用。

我是否这样做是正确的。任何人都可以请为我指出错误吗?

+0

您是否试过定义参数类型:'IO_DataWrite.argtypes = [c_void_p,POINTER(c_uint8),c_uint8]'? –

+1

通常我会'data_tx =(ctypes.c_uint8 * len(data))()',之后将数据复制到数组中并使用'ctypes.byref'调用库。你可以试试这个,而不是从数据构造你的数组 –

+0

@JensMunk把它变成一个答案,这是正确的答案 – zwol

回答

5

您试图实现的目标可以像这样完成。

接口的头,说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号印在屏幕上。

相关问题