|
Модераторы: MetalFan |
|
OK54 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 21.2.2009 Репутация: нет Всего: нет |
Добрый день!
Есть рабочая программа на Delphi, работающая с dll фортран. последних исходников dll нет. Пытаюсь вытащить этот модуль в другую программу - выдает ошибку "... access violation at .... read of address ..." (см. рисунок). Дело в том, что я пытаюсь даже вручную вызывать модуль в начале выполнения этой же программы - один результат. Немного упрощенный код и оформленный как library (версия для подключения в Java): ............................................................................................................................ library GTU; uses Windows, Messages, SysUtils, Variants, Classes, TeEngine, Series, ToolWin, ComCtrls, Math, OleServer, ComObj; procedure GTD(var INI: Integer); cdecl; external 'PD25.dll'; //функции для обмана компилятора - нужно получить адрес общего блока function DB1(i :Integer) :Integer; cdecl; external 'PD25.dll'; //------------------------------------------------------------- type TFnCOMMON = function (i :Integer) :Integer; cdecl; {--------------------------------------------} function GetAdrCOMMON(fn :TFnCOMMON) : Pointer; var Pn1,Pn2,pn3 : Pointer; begin Pn1 := Addr(fn); Pn2 := Pointer(Pointer(Integer(Pn1) + 2)^); Pn3 := Pointer(Pn2^); result := Pn3; end; {--------------------------------------------} type T_ADBL = ARRAY [1..1000] of Double; TP_ADBL = ^T_ADBL; T_AINT = ARRAY [1..1000] of Integer; TP_AINT = ^T_AINT; PDouble = ^Double; PInt = ^Integer; {-----------------------------------------------} var PDB1: ^T_ADBL; {$R *.res} procedure loadAdressGTU(); begin PDB1 := GetAdrCOMMON(DB1); end; procedure setStep(value:Double); stdcall; begin PDB1^[2] := value; end; procedure setFuel(value:Double); stdcall; begin PDB1^[3] := value; end; procedure setPowerLoad(value:Double); stdcall; begin PDB1^[27] := value; end; procedure initialize(); stdcall; var INI : Integer; begin loadAdressGTU(); INI := 0; GTD(INI); end; procedure calculateIteration(); stdcall; var INI : Integer; begin INI := 1; GTD(INI); end; Function getFuel():Double;stdcall; begin Result:=PDB1^[3]; end; function getPowerLoad():Double; stdcall; begin Result := PDB1^[27]; end; function getFreeTurbinePower():Double; stdcall; begin Result := PDB1^[28]; end; function getFreeTurbineSpeed():Double; stdcall; begin Result := PDB1^[9]; end; function getTurbochargerSpeed():Double; stdcall; begin Result := PDB1^[10]; end; function getTurbochargerOutPressure():Double; stdcall; begin Result := PDB1^[31]; end; function getFreeTurbineGasTemperature():Double; stdcall; begin Result := PDB1^[37]; end; function getGasTemperature():Double; stdcall; begin Result := PDB1^[45]; end; function getInpitAirTemperature():Double; stdcall; begin Result := PDB1^[63]; end; exports setStep, setFuel, setPowerLoad, initialize, calculateIteration, getFuel, getPowerLoad, getFreeTurbinePower, getFreeTurbineSpeed, getTurbochargerSpeed, getTurbochargerOutPressure, getFreeTurbineGasTemperature, getGasTemperature, getInpitAirTemperature; end. ............................................................................................................................ Вызывается initialize(); - и выдает ошибку. При этом если вызвать просто loadAdressGTU(), то после этого процедуры set/get работают - это по сути обращение к common блокам. Интерфейс программы на фортране: ............................................................................................................................ SUBROUTINE GTD(INI) IMPLICIT NONE cDEC$ ATTRIBUTES DLLEXPORT::GTD cDEC$ ATTRIBUTES DLLEXPORT:: /DB1/ INTEGER :: INI COMMON/DB1/ A REAL*8, DIMENSION(200) :: A ............................................................................................................................ Как исправить, подскажите пожалуйста? Это сообщение отредактировал(а) OK54 - 28.10.2014, 14:23 Присоединённый файл ( Кол-во скачиваний: 5 ) ошибка.png 150,13 Kb |
|||
|
||||
V0LT |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 91 Регистрация: 16.6.2009 Репутация: нет Всего: 2 |
IDA в помощь ... ну и без фортрановской DLL совсем не понятно куда копать
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
OK54 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 21.2.2009 Репутация: нет Всего: нет |
> IDA в помощь
100% фортран кода смогу декомпилировать? Или пипец запарюсь? > ну и без фортрановской DLL совсем не понятно куда копать что еще кроме приведенного интерфейса PROGRAM PD25 нужно? Саму dll? |
|||
|
||||
V0LT |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 91 Регистрация: 16.6.2009 Репутация: нет Всего: 2 |
||||
|
||||
OK54 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 21.2.2009 Репутация: нет Всего: нет |
положил архив. dll обращается к файлу GTD1.d при вызове метода initialize.
Присоединённый файл ( Кол-во скачиваний: 0 ) GTD.zip 26,83 Kb |
|||
|
||||
OK54 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 21.2.2009 Репутация: нет Всего: нет |
ошибку совершил в описании интерфейса фортран программы, исправил в первом сообщении.
|
|||
|
||||
drkot |
|
|||
Ищущий Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: нет Всего: 8 |
1) Метод - Пошаговая отладка
2) Причина - не (правильно) инициализирован указатель -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |