Я пытаюсь получить доступ к 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?