ctypes:将char的指针分解/转换为char的指针数组

我正在使用C ++中的示例代码来处理封闭源共享库,如下所示:


// Header

#define MAX_PARAM_NAME             10

int foo(..., char **ParNameList, ...);


// Main

char      *ParNameList = (char *)NULL;

ret = foo(..., &ParNameList,...);

par = (char (*)[MAX_PARAM_NAME])ParNameList;

应该如何在ctypes中处理它?


有问题的部分是在函数声明中应该使用foo(..., char **ParNameList, ...);a char **,但char *实际上是在函数调用中给出了对它的引用。


到目前为止,我有:


from ctypes import *

so = cdll.LoadLibrary(...)  

so.foo.argtypes = [                                                                  

...

POINTER(POINTER(c_char)), # ParNameList                       

...

]                                                                                                        

so.foo.restype = c_int                                                               


#...

ParNameList = POINTER(c_char)()

so.foo(..., ParNameList ,...)

这给了我一个垃圾字符串,我在其中看到所需的输出与随机变化的RAM位交错。


但是(char (*)[MAX_PARAM_NAME])强制转换在ctypes中如何工作?


如果整个事情有更直接的方法,我将不胜感激。


郎朗坤
浏览 269回答 2
2回答

暮色呼如

您需要使用传递c_char指针的地址byref:foo.argtypes = [..., POINTER(POINTER(c_char)), ...]foo.restype = c_intpar_name_list = POINTER(c_char)()# pass by referencefoo(byref(par_name_list))par = cast(par_name_list, POINTER(c_char * MAX_PARAM_NAME))之后,您可能需要释放内存。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python