我刚刚为C .dll启动了一些Python包装程序。并使用SWIG。我遇到了一个问题:来自dll的C函数将const char *
的typedef作为参数。我将C语言库的.h包装为以下内容(尝试很多方法使typedef从头文件复制到接口时,真的不知道是否需要这样做):
Added:
%include "cpointer.i"
%pointer_class(signed char, p_char);
%apply const char * { chararrayiwant }; //not sure if only should be char
Old Code:
%include "typemaps.i"
%include "windows.i"
%module somemodule
%{ #include "someheader.h"
typedef char chararrayiwant[33];
%}
%include "someheader.h"
typedef char chararrayiwant[33];
当我尝试像这样在我的Python文件中执行它时:
import mylib as d
...
key = b"somereallylongserialkey" # type: str
p = ctypes.c_char_p(key)
x = d.myfunc(p, 1, None, None)
我遇到以下错误:
x = d.myfunc(p, 1, None, None)
TypeError: in method 'myfunc', argument 1 of type 'chararrayiwant const *'
我已经尝试了2天,但没有找到任何解决方案来使它起作用。
谢谢!
P.S:不适用于添加的行
答案 0 :(得分:1)
我猜您应该将指向字符串的指针传递给myfunc而不是字符串。试试:
p2 = ctypes.addressof(p);
x = d.myfunc(p2, 1, None, None);
第一个函数参数的类型为constchararrayiwant *
,类型为char [33] *
,类型为char**
。
答案 1 :(得分:0)
我认为有关双指针char**
的答案可能是一个很好的起点。
要考虑的另一件事是包括SWIG模块,该模块允许使用指针,并定义您使用的指针类型,如此处所述:http://www.swig.org/Doc1.3/Library.html
类似这样的东西:
%include "cpointer.i"
/* Create some functions for working with "char *" */
%pointer_functions(char, char_p);
/* A function that uses a "char *" */
void add(int x, int y, char_p *result);
在没有此模块的情况下,SWIG似乎不支持使用指针。