ptyhong调用DLL,怎么使用结构体数组指针做参数

 我来答
llzzcc66
2016-11-21 · 知道合伙人数码行家
llzzcc66
知道合伙人数码行家
采纳数:81385 获赞数:171491
公司运维员工

向TA提问 私信TA
展开全部
ptyhong调用DLL,如何使用结构体数组指针做参数
C++函数原型

typedef struct

{

unsigned long DeviceType;

int Handle;

int NumberOfClients;

int SerialNumber;

int MaxAllowedClients;

}NeoDevice;

int _stdcall icsneoFindNeoDevices(unsigned long DeviceTypes, NeoDevice *pNeoDevices, int *pNumberOfDevices);

使用python如下:

class NeoDevice(Structure):

_fields_ = [("DeviceType",c_ulong),

("Handle",c_int),

("NumberOfClients",c_int),

("SerialNumber",c_int),

("MaxAllowedClients",c_int)]

class cNeoVICan(CCanBase):

def __init__(self):

neoVi = windll.icsneo40

self.icsneoFindNeoDevices = neoVi.icsneoFindNeoDevices

if __name__ == "__main__":

canBus = cNeoVICan()

print canBus.icsneoGetDLLVersion()

iNumberOfDevices = [NeoDevice() for x in range(10)]

num = c_int

iResult = canBus.icsneoFindNeoDevices(c_ulong(65535), pointer(iNumberOfDevices), byref(num))

但是会报如下错误:
Traceback (most recent call last):
File "C:\Work\Project\GUI\wxPyCANC303\Drv\source\src\drv\neoVI\cNeoVICan.py", line 224, in <module>
iResult = canBus.icsneoFindNeoDevices(c_ulong(65535), pointer(iNumberOfDevices), byref(num))
TypeError: _type_ must have storage info

请问是什么错误原因啊?
谢谢。
------解决方案--------------------
因为python的list不是一个ctypes类型
正确做法是
class NeoDevice(Structure):

_fields_ = [("DeviceType",c_ulong),

("Handle",c_int),

("NumberOfClients",c_int),

("SerialNumber",c_int),

("MaxAllowedClients",c_int)]

class cNeoVICan(CCanBase):

def __init__(self):

neoVi = windll.icsneo40

self.icsneoFindNeoDevices = neoVi.icsneoFindNeoDevices

if __name__ == "__main__":

canBus = cNeoVICan()

print canBus.icsneoGetDLLVersion()

iNumberOfDevices = (NeoDevice * 10)()

num = c_int()

iResult = canBus.icsneoFindNeoDevices(c_ulong(65535), cast(iNumberOfDevices, POINT(NeoDevice)), byref(num))
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式