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

时间:2018-06-22 10:16:45

标签: python c++ pointers ctypes

我正在使用具有C ++示例代码的封闭源共享库,如下所示:

f_action->setIconText("Click...");

应如何在ctypes中进行处理?

有问题的部分是在函数声明f_action->setText中应该有一个// Header #define MAX_PARAM_NAME 10 int foo(..., char **ParNameList, ...); // Main char *ParNameList = (char *)NULL; ret = foo(..., &ParNameList,...); par = (char (*)[MAX_PARAM_NAME])ParNameList; ,但是实际上在函数调用中给出了对foo(..., char **ParNameList, ...);的引用。

到目前为止,我有:

char **

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

但是char *如何在ctypes中强制转换?

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

2 个答案:

答案 0 :(得分:1)

您需要使用c_char传递byref指针的地址:

foo.argtypes = [..., POINTER(POINTER(c_char)), ...]
foo.restype = c_int

par_name_list = POINTER(c_char)()

# pass by reference
foo(byref(par_name_list))

par = cast(par_name_list, POINTER(c_char * MAX_PARAM_NAME))

您之后可能需要释放内存。

答案 1 :(得分:0)

有一个pythonic解决方法,我想与大家分享一下它的完整性,虽然不好,但是可以用。

# ParNumber is known, ParNameList is a string
pars = []                                                                                          
for i in range(ParNumber):                                                                        
    q = ParNameList[i*10:i*10+10]                                                                      
    q = q[:q.index('\0')]                                                                          
    print q                                                                                        
    pars.append(q)    

仍然想知道,有什么更好的方法