我正在使用具有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中强制转换?
如果整件事有更直接的方法,我将不胜感激。
答案 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)
仍然想知道,有什么更好的方法