Я пытаюсь вызвать функцию из dll в python 3.4 со следующей подписью (подробнее: http://www.lawlabs.ru/parser_address.htm):
function GetAddressFields(
AddressStr: String;
var FullStr: String;
var QualifiedStr: String;
Separator: ShortString = #13#10;
IsRussia: Boolean = True;
WithDescription: Boolean = True;
WithExceptions: Boolean = True;
LastIsHome: Boolean = True;
Subject: Boolean = True;
WithUnrecognized: Boolean = True): String;
Я думаю, что синтаксис Delphi, и я получаю сообщение об ошибке при использовании ctypes для этой подписи.
Мое ожидаемое совпадение для типов delphi и ctypes:
String -> c_char_p
ShortString -> c_char_p
var String -> POINTER(c_char_p)
boolean -> c_bool
Поэтому подпись функции в Python (где dll = windll.LoadLibrary (...)):
dll.GetAddressFields.argtypes = (
c_char_p,
POINTER (c_char_p),
POINTER (c_char_p),
c_char_p,
c_bool,
c_bool,
c_bool,
c_bool,
c_bool,
c_bool)
dll.GetAddressFields.restype = c_char_p
Однако с этой подписью возникает ошибка.
Попытка передать параметры:
param_1 = c_char_p("".encode("ascii"))
param_2 = c_char_p("".encode("ascii"))
result = dll.GetAddressFields(
c_char_p('test'.encode("ascii")),
byref(param_1),
byref(param_2),
c_char_p("\r\n".encode("ascii")),
True,
True,
True,
True,
True,
True)
Полный код ошибки:
OSError: exception: access violation reading 0x00000001
Интересно, что при замене первого логического параметра на False мы имеем
OSError error: exception: access violation reading 0x00000000
При попытке передать логические параметры по ссылке возникает ошибка со случайными адресами
Как решить эту проблему?