2017-02-21 18 views
1

У меня есть функция в DLL и попытаться вызвать его в Python 3. Функция прототип:Неправильный тип возвращаемого значения при вызове функции из DLL в 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

ctypes преобразует 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 и вы получите ctypes объект:

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'