在python中导入C dll函数

时间:2017-07-04 10:23:56

标签: python c dll

我的DLL文件中的 stringUpcase 函数应该使用哪种数据类型

void __cdecl stringUpcase(char IN_str[], char OUT_str[], int32_t len);

我在Python 3.6中尝试ctype.c_char_p,这个函数应该返回大写字符串" HELO"在OUT_str变量中。

dl = ctypes.cdll.LoadLibrary("path/of/dll/file.dll")

IN_str = 'helo'
OUT_str = ''
IN_len = len(IN_str)

dl.stringUpcase.restype = ctypes.c_void_p
dl.stringUpcase.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int32]

dl.stringUpcase(IN_str, OUT_str, IN_len);

控制台错误输出

 line 21, in <module>
    dl.stringUpcase(IN_str, OUT_str, IN_len);
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

您正在尝试将python字符串作为import ctypes ins = ctypes.c_char_p(b'helo') lens = len(ins.value) outs = ctypes.create_string_buffer(lens+1) lib = ctypes.cdll.LoadLibrary("./upper.so") lib.stringUpcase.restype = None lib.stringUpcase.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int32] lib.stringUpcase(ins, outs, lens) print(outs.value) 类型的参数传递。与python2不同的Python3对于输入ctypes非常严格。

工作样本看起来像这样。

c_char_p

注意len指向以零结尾的字符串的事实,因此c_char_p参数在这里是多余的。此外,要构造c_wchar_p,您需要传递字节对象或整数地址而不仅仅是字符串,以便能够使用字符串作为参数,您需要使用wchar_t*类型和C in你的图书馆分别。

需要注意的另一件事是,outs函数不会分配内存,因此您需要GET /_search { "query": { "bool": { "should": [{ "query_string": { "query": "sales" } }, { "has_parent": { "type": "role_permission_parent", "query": { "match": { "resourceURI": "urn:module:com.qad.collaboration" } } } }] } }, "size": 100 } 足够大才能包含结果。