我有一个C ++ dll,其中一个导出函数定义如下:
OPERATEMYSQLSTDCALL_API int __stdcall CheckMac(char * pcMac, OUT LPSTR errorInfo);
我在python中使用它,使用ctypes库,我读了一些信息并将其称为follws:
from ctypes import *
lib = WinDLL('OperateMysqlStdcall.dll')
CheckMac = lib.CheckMac
CheckMac.argtypes = [c_char_p, POINTER(c_wchar_p)]
CheckMac.restype = c_int
p1=c_wchar_p()
value = CheckMac('88888888',byref(p1));
print p1.value
但是当我执行它时,它返回None,我确定C ++中的值“OUT LPSTR errorInfo”不是NULL,我在控制台中打印它并且它显示正确。任何人都告诉我为什么它不能工作在python.Thank U非常!
答案 0 :(得分:2)
LPSTR
的类型为char*
,因此您也应该使用c_char_p
作为其类型。但是,作为输出参数,您需要一个可写的字符串缓冲区。理想情况下,API应指示传递的缓冲区大小,以便检查缓冲区溢出。
这里有一些测试DLL代码:
#include <windows.h>
extern "C" __declspec(dllexport)
int __stdcall CheckMac(char* pcMac, LPSTR errorInfo)
{
strcpy(errorInfo, pcMac);
return 1;
}
和Python:
from ctypes import *
lib = WinDLL('test.dll')
CheckMac = lib.CheckMac
CheckMac.argtypes = [c_char_p, c_char_p]
CheckMac.restype = c_int
errorInfo = create_string_buffer(1024)
value = CheckMac('88888888',errorInfo);
print errorInfo.value
输出:
88888888