将数组参数从外部dll传递给Python

时间:2014-08-28 15:19:30

标签: arrays dll parameters ctypes

我试图用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数组时,我就被卡住了。

任何帮助将不胜感激。

1 个答案:

答案 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]