Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2018 12:28:28

Maverick_B
Зарегистрирован: 2018-10-16
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Access violation при вызове функции из dll

Здравствуйте!
Есть dll, написанная на Delphi.
Описание функции из dll для подключения к БД:

 function IC_reg(aserver_host: Pchar;
                           aserver_port: Pchar;
                           arm:char;
                           user_name,password: Pchar;
                           var answer: Pchar; abufsize: integer):integer; stdcall;

Пример работающего кода на Delphi:
 procedure TForm1.RegBitBtnClick(Sender: TObject);
var rp: Pchar;
    ri: integer;
begin
GetMem(rp,32000);
ri:=IC_reg('127.0.0.1','6666',IRBIS_ADMINISTRATOR,'1','1',rp,32000);
Caption:=IntToStr(ri);
Memo1.Lines.Text:=String(rp);
FreeMem(rp);
end;

Мой код на Python:
 from ctypes import *
_dll = windll.irbis64_client
IC_reg = _dll.IC_reg
ServerIP = "127.0.0.1"
ServerPort = "6666"
ARM = "A"
Login = "1"
Password = "1"
sBuffer = c_wchar_p(" " * 32000)
Size = 32000
IC_reg.restypes = [c_wchar_p, c_wchar_p, c_wchar, c_wchar_p, c_wchar_p, c_wchar_p, c_int]
IC_reg.argtypes = [c_wchar_p, c_wchar_p, c_wchar, c_wchar_p, c_wchar_p, POINTER(c_wchar_p), c_int]
ans = IC_reg(ServerIP, ServerPort, ARM, Login, Password, byref(sBuffer), Size)

Как реализовать, подглядел тут: https://ru.stackoverflow.com/questions/766433/Вызов-функции-из-dll-написанной-на-delphi-из-python

При выполнении кода вываливается “Access violation at address 4004D597 in module ”irbis64_client.DLL“. Read of address 00000000.”
В чем может быть проблема?

Офлайн

#2 Окт. 17, 2018 14:49:33

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Access violation при вызове функции из dll

Что такое ARM?
На Делфи это IRBIS_ADMINISTRATOR
у вас “А”

попробуйте без переменных
ans = IC_reg(“127.0.0.1”) и так далее



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Окт. 18, 2018 12:51:49

Maverick_B
Зарегистрирован: 2018-10-16
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Access violation при вызове функции из dll

ZerG
Что такое ARM?На Делфи это IRBIS_ADMINISTRATORу вас “А”попробуйте без переменныхans = IC_reg(“127.0.0.1”) и так далее
В файле описания функций библиотеки задана переменная:
 IRBIS_ADMINISTRATOR = 'A';
Получается, что я просто использовал другое имя.

Без переменных пробовал - результат тот же, но для буфера (sBuffer) все равно нужна переменная, так как в нее функция пишет ответ.

Офлайн

#4 Окт. 19, 2018 09:37:24

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Access violation при вызове функции из dll

посмотрите
https://github.com/amironov73/PythonIrbis

Это готовая либа. В ней вы найдете методы подключения и решения вопросов.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Ноя. 8, 2018 09:41:40

Maverick_B
Зарегистрирован: 2018-10-16
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Access violation при вызове функции из dll

ZerG
посмотрите https://github.com/amironov73/PythonIrbisЭто готовая либа. В ней вы найдете методы подключения и решения вопросов.
Спасибо вам! Работает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version