我试图用Python中的外部DLL调用一个函数。
函数原型是:
void Myfunction(int32_t *ArraySize, uint64_t XmemData[])
此函数使用" ArraySize"创建一个uint64表。元素。这个dll是由labview生成的。
以下是调用此函数的Python代码:
import ctypes
# Load the library
dllhandle = ctypes.CDLL("SharedLib.dll")
#specify the parameter and return types
dllhandle.Myfunction.argtypes = [ctypes.c_int,ctypes.POINTER(ctypes.c_uint64)]
# Next, set the return types...
dllhandle.Myfunction.restype = None
#convert our Python data into C data
Array_Size = ctypes.c_int(10)
Array = (ctypes.c_uint64 * Array_Size.value)()
# Call function
dllhandle.Myfunction(Array_Size,Array)
for index, value in enumerate(Array):
print Array[index]
执行此操作时,我收到错误代码:
dllhandle.ReadXmemBlock(Array_Size,Array)
WindowsError: exception: access violation reading 0x0000000A
我想我没有正确地将参数传递给函数,但我无法弄明白。
我尝试从labview dll中分类简单数据,就像uint64一样,并且工作正常;但是当我试图传递uint64数组时,我就被卡住了。
任何帮助将不胜感激。
答案 0 :(得分:1)
看起来它正在尝试访问内存地址0x0000000A(即10)。这是因为你传递了一个int而不是一个指向int的指针(尽管那仍然是一个int),并且你正在使int = 10。
我从:
开始import ctypes
# Load the library
dllhandle = ctypes.CDLL("SharedLib.dll")
#specify the parameter and return types
dllhandle.Myfunction.argtypes = [POINTER(ctypes.c_int), # make this a pointer
ctypes.c_uint64 * 10]
# Next, set the return types...
dllhandle.Myfunction.restype = None
#convert our Python data into C data
Array_Size = ctypes.c_int(10)
Array = (ctypes.c_uint64 * Array_Size.value)()
# Call function
dllhandle.Myfunction(byref(Array_Size), Array) # pass pointer using byref
for index, value in enumerate(Array):
print Array[index]