1

我需要 Python 中的以下 C 函数:

int func(Uint8 *bytRecvBuffer, int *iRecvLen);

我在 Python 中尝试过:

mydll = cdll.LoadLibrary("my.dll")

recvBuffer = None
recvLength = None

funcFunction = getattr(mydll, "func")
funcFunction(POINTER(c_ubyte(recvBuffer)), POINTER(c_int(recvLength)))

错误信息:

TypeError:需要一个整数

这里的参数有什么问题?

4

4 回答 4

2

None 不是整数。

c_int(None) 导致 TypeError

用 0 初始化变量,而不是 None

于 2012-06-19T14:10:23.470 回答
2

您需要分配一个实际的缓冲区和整数:

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))
于 2012-06-19T14:44:30.100 回答
0

您是否尝试使用 windll 而不是 cdll 加载 dll?还有....不是指针而不是 POINTER 吗?

于 2012-06-19T13:55:22.797 回答
0

从您的初始化猜测recvBuffer并且recvLength您想要创建空指针。

在这种情况下,您应该创建一个没有特定类型参数的实例,请执行以下操作:

recvBuffer = POINTER(c_ubyte)()   
recvLength = POINTER(c_int)()

funcFunction(recvBuffer, recvLength)

如果您在 python 中获得了缓冲区,则需要将固定大小的数组转换为正确的指针类型。

于 2012-06-19T14:55:08.750 回答