2017-02-21 115 views
1

從調用DLL函數,當我在DLL函數,並嘗試調用它在Python 3函數原型爲:錯誤的返回類型在Python

__declspec(dllexport) char* getmetadata(char* szFile, size_t* metadata_size); 

Python代碼是:

... 
libm = ctypes.CDLL("libm.dll") 
fc = libm.getmetadata 
fc.restype = ctypes.c_char_p 
fc.argtypes = [ctypes.c_char_p, ctypes.POINTER(ctypes.c_size_t)] 
size = ctypes.c_size_t(0) 
buffer = fc(bytes(path, "utf8"), ctypes.byref(size)) 

類型的緩衝區是字節。爲什麼它不是c_char_p?

回答

1

​​將c_char_p自動轉換爲Python的本機字節類型。這是一個方便:

from ctypes import * 
dll = CDLL('msvcrt') 
dll._getcwd.argtypes = c_char_p,c_int 
dll._getcwd.restype = c_char_p 
out = create_string_buffer(30) 
print(dll._getcwd(out,30)) 

輸出:

b'C:\\Users\\xxx\\Desktop' 

但使用的東西,除了c_char_p,你會得到一個​​對象:

dll._getcwd.restype = POINTER(c_byte) 
result = dll._getcwd(out,30) 
print(result) 
print(string_at(result)) 

輸出:

<__main__.LP_c_byte object at 0x0000000002C81248> 
b'C:\\Users\\xxx\\Desktop'