有没有办法通过 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 中的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

C# :- P/调用签名

从 C++ 中 WMI 中的 OUT 参数获取值

有没有办法通过按下按钮从 JS 向 C++ 发送 http 请求

有没有办法在 C++ 中将 auto 作为参数传递?

PLSQL中的三种参数模式INOUTIN OUT

使用 OpenCV 将视频帧读取到指定的指针(C++)