2017-07-04 126 views
1

的数据类型应在此stringUpcase函数中使用我的DLL文件导入C DLL函数

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

'strCnt'或'stringUpcase'? – purplepsycho

+0

对不起我的错误...它是** stringUpcase **函数 –

回答

1

您试图将python字符串作为c_char_p类型的参数传递。与python2不同,python3对ctypes的输入非常严格。

工作示例看起来像这样。

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) 

注重事实,c_char_p指向零结尾的字符串,所以len说法是多余这里。此外,要构造c_char_p,您需要传递字节对象或整数地址而不仅仅是一个字符串,以便能够使用字符串作为参数,您需要分别在库中使用c_wchar_p类型和wchar_t*

还有一件需要注意的事实是,您的C函数不会分配内存,因此您需要的outs必须足够大以包含结果。

+0

谢谢你的工作真的很好,但输出是** b'HELO'**,我想将它转换回“python”**字符串**。所以结果将只有** HELO **这怎么可能? –

+0

@MichalMarcin在某些编码中解码它们,就像这样'print(outs.value.decode('ascii'))' – tgregory