我正在尝试调用dll中的一个函数,该函数名为
当按原样运行时,它会产生以下(预期的)输出:
如果我取消注释下面的代码行,并注释上面的代码行,将会得到(意料之外的)输出结果:
pop()
,有两个参数,一个整数和指向整数的指针。第一个参数是第二个参数开始的数组的长度。此函数应返回指向整数的指针,它是由n-1
个元素组成的数组的第一个元素,其中n
是原始数组中的元素数量。返回的数组应该是原始数组,不包括第0个元素。
我的代码:
from ctypes import cdll, c_int, POINTER
lib = cdll.LoadLibrary('extlib.dll')
lib.pop.restype = POINTER(c_int)
#lib.pop.restype = c_int*4
testArray = (c_int*5)(*[5,6,7,8,9])
output = list(lib.pop(5, testArray)[0:4])
print output
当按原样运行时,它会产生以下(预期的)输出:
[6, 7, 8, 9]
如果我取消注释下面的代码行,并注释上面的代码行,将会得到(意料之外的)输出结果:
[6618688, 0, 2, 0]
看起来类型 c_int*4
和 POINTER(c_int)
是不同的,我相信这就是我改变的全部内容。然而,Python文档似乎表明它们应该是一样的。这是怎么回事?具体地说,为什么这两个代码版本的执行结果不同?
c_void_p
或c_longlong
代替c_int
,因为在64位Windows上它们应该是指针大小(c_int
仍然是32位)。 - 101