Ошибка в значениях, переданных byref, вызывающим dll в python

Я имею к различным dll экспортируя эти функции (одна функция каждая dll):

Dll1:

DECLDIR void getFrameworkVersion(int* pMajor, int* pMinor, int* pBugfix);

dll2:

void __stdcall getFrameworkVersion(int* pMajor, int* pMinor, int* pBugfix);

Я импортирую обе библиотеки DLL в Python без ошибок, а также вызываю их без ошибок. Однако я получаю неправильные значения

dll1 = cdll.LoadLibrary('dll1')
dll2 = oledll.LoadLibrary('dll2')

pMajor = pMinor = pbugFix = c_int()

dll1.getASTFrameworkVersion.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)]
#test.eval.restype = ctypes.c_double
dll1.getASTFrameworkVersion(byref(pMajor), byref(pMinor), byref(pbugFix))
astVersion = "AST Framework version: " + str(pMinor.value) + "."  + str(pbugFix.value) + "."  + str(pMajor.value)

dll2.getFrameworkVersion.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)]
dll2.getFrameworkVersion(byref(pMajor), byref(pMinor), byref(pbugFix))
asfVersion = "ASF Framework version: " + str(pMinor.value) + "."  + str(pbugFix.value) + "."  + str(pMajor.value)

Я получаю этот вывод:

    AST Framework version: 0.0.0
    ASF Framework version: 14.14.14

1 ответ

Решение

pMajor = pMinor = bugFix = c_int() неправильно: все три имени Python одинаковы c_int экземпляр, поэтому будет содержать то же значение! То, что вы делаете, эквивалентно следующему коду в C:

int x;
getFrameworkVersion(&x, &x, &x);

Так что факт, что вы получаете 0.0.0 вероятно, потому что реальный результат закончится .0, который перезаписывает два предыдущих значения.

Другие вопросы по тегам