我的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
感谢您提供的任何帮助。
答案 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
}
足够大才能包含结果。