Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用C类型_Python_C_Dll_Ctypes - Fatal编程技术网

在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))) 我

我需要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)))
我尝试了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初始化变量,而不是None

None不是整数

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,澄清<代码>指针(类型)接受类型并为该类型创建指针类型<代码>指针(实例)获取一个实例并实例化指向该实例的指针。