2017-02-21 116 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'