有没有办法通过C ++中的OUT参数在Python中接收返回值?

时间:2017-09-13 07:11:38

标签: python c++ ctypes out-parameters

我有一个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非常!

1 个答案:

答案 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