2017-07-04 87 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