2015-11-19 176 views
1

我正在编写一个封装了一些C++代码的Python模块。我用这个功能从C++传递一个指针到Python(指针会由不同的功能Python ctypes,将c_void_p作为输出参数传递给c函数

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和传球创造一个新的空指针使用的功能它以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)()来创建一个双数组,并将其传递给要写入的c函数,为什么我不能为同一目的传递一个void指针?

+0

如果'run'需要一个'无效**'应该输入这样。在这种情况下,在Python中传递'byref(p)'作为参数。在C或C++中,取消引用指针来存储值,例如'* output = some_address'。 – eryksun

+0

@eryksun哇,我的整个问题都是'run' **而不是**期待'void **'。简单的修复,谢谢! – colinbrownec

回答

2

由于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 
相关问题