Python ctypes,将c_void_p作为out参数传递给c函数

时间:2015-11-19 19:59:48

标签: python c++ ctypes

我正在编写一个包含一些C ++代码的Python模块。我曾经使用这个函数将指针从C ++传递给Python(指针将由不同的函数释放

DLLEXPORT void* run(double input1, double input2)

我添加了错误返回码,所以我的新功能看起来像

DLLEXPORT int run(double input1, double input2, void* output)

但是现在我似乎无法获得指针的值,在Python中我用ctypes设置函数如下

from ctypes import *
mydll = cdll.mydll

mydll.run.argtypes = [c_double, # input 1
                      c_double, # input 2
                      c_void_p] # output pointer
mydll.run.restype  = c_int   

然后我通过在Python中创建一个新的void指针并将其传递给dll函数

来使用该函数
p = c_void_p()

retval = mydll.run(1.2, 3.4, p)

print p

运行此代码后,我的p等于c_void_p(None)

将此指针传递给其他函数会导致地址0x0处的非法访问异常,因此我认为它不会被更新。

我希望在执行后填充p的地址。我错过了ctypes的东西?我可以通过分配(c_double * 10)()创建一个double数组并将其传递给要写入的c函数,为什么我不能为同一目的传递一个void指针?

1 个答案:

答案 0 :(得分:3)

正如eryksun的评论指出,要void*作为输出参数,它应该是void**

# DLLEXPORT int run(double input1, double input2, void** output)

from ctypes import *
mydll = cdll.mydll

mydll.run.argtypes = [c_double, # input 1
                      c_double, # input 2
                      POINTER(c_void_p)] # output pointer
mydll.run.restype  = c_int

p = c_void_p()
retval = mydll.run(1.2,3.4,byref(p))

print p.contents