Портирование вызова библиотеки ctypes с Python 2,7 на 3,8 - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь получить доступ к C -функциям со следующими прототипами через библиотеку ctypes в python

HandleT OpenFile (const char *FName, ResultT *ReturnCode);
ResultT GetItem (HandleT handle, void **data, int *len);

ResultT - перечисление.

Допустим, я использую код python:

FILE = "E:/LogData/!d1fx/D1F1"


clib = ctypes.CDLL('c_libs\RAWRD64.dll')

data = ctypes.c_void_p(0)
datalen = ctypes.c_int()
result = ctypes.c_int()
handle = ctypes.c_void_p()


handle = clib.OpenFile(FILE, ctypes.byref(result))

#debug output
print ("handle: %d, ret: %d" %(handle, result.value))

clib.GetItem(handle, ctypes.byref(data), ctypes.byref(datalen))

#debug output
print ("result: %d" % (result.value))
print ("data: %s, len: %d" %(data.value, datalen.value))

При python 2.7 на машине Windows 7 этот код работает. Сейчас я выполняю миграцию на компьютер Windows 10 и пытаюсь перенести этот код на python 3.8.

Первая проблема, с которой я столкнулся, была в том, что openFile () возвратил, что он не может открыть файл. Это можно исправить, добавив кодировку к имени файла.

handle = clib.OpenFile(FILE.encoding("ANSI"), ctypes.byref(result))

Однако теперь GetItem () вызывает следующее исключение:

handle: 389636160, ret: 0
Traceback (most recent call last):
  File ".\test_clib.py", line 19, in <module>
    clib.GetItem(handle, ctypes.byref(data), ctypes.byref(datalen))
OSError: exception: access violation reading 0x0000000017396040

Почему этот код вызывает исключение с pyhton 3.8 и работа с 2.7? Есть ли разница в том, как DLL обрабатываются ctypes?

...