【问题标题】:Is there a way to receive the return value in Python through the OUT parameter in C++?有没有办法通过 C++ 中的 OUT 参数接收 Python 中的返回值?
【发布时间】:2023-03-06 07:09:01
【问题描述】:

我有一个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 中。非常感谢你!

【问题讨论】:

标签: python c++ ctypes out-parameters


【解决方案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

【讨论】:

  • 非常感谢你,你的回答对我很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2012-03-17
  • 2013-05-03
相关资源
最近更新 更多