在Python中使用C类型
我需要Python中的以下C函数:在Python中使用C类型,python,c,dll,ctypes,Python,C,Dll,Ctypes,我需要Python中的以下C函数: int func(Uint8 *bytRecvBuffer, int *iRecvLen); mydll = cdll.LoadLibrary("my.dll") recvBuffer = None recvLength = None funcFunction = getattr(mydll, "func") funcFunction(POINTER(c_ubyte(recvBuffer)), POINTER(c_int(recvLength))) 我
int func(Uint8 *bytRecvBuffer, int *iRecvLen);
mydll = cdll.LoadLibrary("my.dll")
recvBuffer = None
recvLength = None
funcFunction = getattr(mydll, "func")
funcFunction(POINTER(c_ubyte(recvBuffer)), POINTER(c_int(recvLength)))
我尝试了Python:
int func(Uint8 *bytRecvBuffer, int *iRecvLen);
mydll = cdll.LoadLibrary("my.dll")
recvBuffer = None
recvLength = None
funcFunction = getattr(mydll, "func")
funcFunction(POINTER(c_ubyte(recvBuffer)), POINTER(c_int(recvLength)))
错误消息:
TypeError:需要一个整数
参数有什么问题吗?是否尝试用Windl而不是cdll加载dll?还有…它不是指针而不是指针吗?您是否尝试用Windl而不是cdll加载dll?还有……它不是指针而不是指针吗?无不是整数 c_int(无)导致类型错误 用0初始化变量,而不是NoneNone不是整数 c_int(无)导致类型错误
用0而不是None初始化变量您需要分配一个实际的缓冲区和整数:
from ctypes import *
mydll = CDLL("my")
recvBuffer = create_string_buffer(1000)
recvLength = c_int(1000)
mydll.func(recvBuffer,byref(recvLength))
您还可以声明func支持的特定参数,但还必须更明确地说明传递的参数:
mydll.func.argtypes = [POINTER(c_ubyte),POINTER(c_int)]
mydll.func.restype = c_int
recvBuffer = (c_ubyte*1000)()
recvLength = c_int(1000)
mydll.func(recvBuffer,byref(recvLength))
您需要分配一个实际的缓冲区和整数:
from ctypes import *
mydll = CDLL("my")
recvBuffer = create_string_buffer(1000)
recvLength = c_int(1000)
mydll.func(recvBuffer,byref(recvLength))
您还可以声明func支持的特定参数,但还必须更明确地说明传递的参数:
mydll.func.argtypes = [POINTER(c_ubyte),POINTER(c_int)]
mydll.func.restype = c_int
recvBuffer = (c_ubyte*1000)()
recvLength = c_int(1000)
mydll.func(recvBuffer,byref(recvLength))
通过初始化
recvBuffer
和recvLength
猜测,您希望创建空指针
在这种情况下,应创建不带特定类型参数的实例,请执行以下操作:
recvBuffer = POINTER(c_ubyte)()
recvLength = POINTER(c_int)()
funcFunction(recvBuffer, recvLength)
如果您在python中获得了缓冲区,则需要将固定大小的数组强制转换为正确的指针类型。通过初始化
recvBuffer
和recvLength
猜测您想要创建空指针
在这种情况下,应创建不带特定类型参数的实例,请执行以下操作:
recvBuffer = POINTER(c_ubyte)()
recvLength = POINTER(c_int)()
funcFunction(recvBuffer, recvLength)
如果在python中获得了缓冲区,则需要将固定大小的数组强制转换为正确的指针类型。@leon22,澄清<代码>指针(类型)接受类型并为该类型创建指针类型<代码>指针(实例)获取一个实例并实例化指向该实例的指针。@leon22,澄清<代码>指针(类型)接受类型并为该类型创建指针类型<代码>指针(实例)获取一个实例并实例化指向该实例的指针。