У меня есть 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. Большое спасибо!
Тип 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
Других решений пока нет …