有没有办法通过 C++ 中的 OUT 参数接收 Python 中的返回值?
Posted
技术标签:
【中文标题】有没有办法通过 C++ 中的 OUT 参数接收 Python 中的返回值?【英文标题】:Is there a way to receive the return value in Python through the OUT parameter in C++? 【发布时间】:2017-09-13 07:11:38 【问题描述】:我有一个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 中。非常感谢你!
【问题讨论】:
这个链接可能对***.com/questions/145270/calling-c-c-from-python有帮助 【参考方案1】: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
【讨论】:
非常感谢你,你的回答对我很有帮助!以上是关于有没有办法通过 C++ 中的 OUT 参数接收 Python 中的返回值?的主要内容,如果未能解决你的问题,请参考以下文章