Есть ли способ получить возвращаемое значение в Python через параметр OUT в C ++?

У меня есть C ++ dll, одна из функций экспорта определяется следующим образом:

OPERATEMYSQLSTDCALL_API  int __stdcall CheckMac(char * pcMac, OUT  LPSTR errorInfo);

Я использую его в Python, использую библиотеку ctypes, я читаю некоторую информацию и называю ее следующим образом:

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, я уверен, что значение «OUT LPSTR errorInfo» в C ++ не равно NULL, я печатаю его в консоли, и он показывает Correctly. Может кто-нибудь сказать мне, почему он не может работать в 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;
}

И питон:

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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]