Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов Fortran из Delphi 
:(
    Опции темы
OK54
Дата 25.10.2014, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
V0LT
Дата 27.10.2014, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



IDA в помощь ... ну и без фортрановской DLL совсем не понятно куда копать

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL ICQ   Вверх
OK54
Дата 27.10.2014, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.2.2009

Репутация: нет
Всего: нет



> IDA в помощь
100% фортран кода смогу декомпилировать? Или пипец запарюсь?

>  ну и без фортрановской DLL совсем не понятно куда копать
что еще кроме приведенного интерфейса PROGRAM PD25 нужно? Саму dll?
PM MAIL   Вверх
V0LT
Дата 27.10.2014, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



Как минимум

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL ICQ   Вверх
OK54
Дата 27.10.2014, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.2.2009

Репутация: нет
Всего: нет



положил архив. dll обращается к файлу GTD1.d при вызове метода initialize.

Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  GTD.zip 26,83 Kb
PM MAIL   Вверх
OK54
Дата 28.10.2014, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.2.2009

Репутация: нет
Всего: нет



ошибку совершил в описании интерфейса фортран программы, исправил в первом сообщении.
PM MAIL   Вверх
drkot
Дата 14.11.2014, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



1) Метод - Пошаговая отладка
2) Причина - не  (правильно) инициализирован указатель


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.