Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странность с вызовом функции из DLL


Страницы:   1 2

Углук ©   (2007-03-05 13:47:00) 

Здравствуйте!
У меня возникла следующая ситуация:
Есть проект, который вызывает функции DLL.

В функции EntryPoint, привязал к  DLL_PROCESS_DETACH одну функцию.
При отладке полоска трассировки  заглядывает внутрь на begin, а затем прыгает в другую функцию! Чушь какая-то, что там происходит, может кто-то сталкивался? Прилагаю код DLL:

Примечание:
Внутри эта DLL,в свою очередь вызывает еще одну DLL.

procedure RunL; stdcall;
var i: byte;
  bVoltage, bSubIndex: BYTE;

   w:word;
begin
AssignFile(f,'dll_log.txt');
Rewrite(f);
InitHAL();
writeln(f,' '+DateTimeToStr(Now));
ActualChannels:=0;
for i:= 0 to 5 do begin
  GetID(i,@bVoltage,@bSubIndex);
//GetID вызов функции еще одной DLL (трассируется нормально)

if bVoltage>0 then
begin
 Inc(ActualChannels,1);
 writeln(f,' Active '+ IntToStr(i) + 'Channel' );
end;
end;

end;

procedure CloseS; stdcall;
begin
writeln(f,DateTimeToStr(Now));
CloseFile(f);
CloseHAL();
end;

procedure EntryProc(dwReason: DWORD);
begin
case dwReason of
  DLL_PROCESS_DETACH: CloseS;
end;
end;

exports   CountVoltage;
exports   RecountADCVoltage;
exports   CountCurrent;
exports   StaticChange;
exports   RecountCurrent;
exports   Runl;
exports   CloseS;

Из процедуры CloseS "заскакивает" в RunL


Углук   (2007-03-05 14:00:00) [21]

в хост-приложении написано
uses .....,unit2;


Сергей М.   (2007-03-05 13:59:00) [22]


> Углук ©   (05.03.07 13:57) [6]


> var f:textfile; объявлено в глобале


Да фиолетово где ты объявляешь f )

Ты в вопросы вник ?


Углук   (2007-03-05 13:58:00) [23]

Декларация прописана в pas файле

unit Unit2;

interface
uses Windows,Classes;

function RecountCurrent(Current:Word; Channel:byte):Extended; external 'Project2.dll';
function RecountADCVoltage(Voltage:Word;Channel:byte):Extended;external 'Project2.dll';
function CountVoltage(V:Extended; Channel:byte):Word;external 'Project2.dll';
procedure StaticChange(Channel: byte; var NewValue:Extended); external 'Project2.dll';
function CountCurrent(V:Extended; Channel:byte):Word;external 'Project2.dll';
function GetStaticVoltage(Channel:byte):Extended; external 'Project2.dll';
function GetStaticCurrent(Channel:byte):Extended; external 'Project2.dll';
procedure RunL; external 'Project2.dll';
procedure CloseL; external 'Project2.dll';

implementation

end.


Углук   (2007-03-05 13:57:00) [24]

var f:textfile; объявлено в глобале. Открывается в RunL , закрывается в CloseL...типа...


Сергей М.   (2007-03-05 13:57:00) [25]


> Углук ©   (05.03.07 13:53) [2]


Что за бред ?

Гдев проекте хост-приложения декларация идентификатора RunL ?
Ты что, еще и статически (!!) импортируешь RunL ?!


Сергей М.   (2007-03-05 13:55:00) [26]


> DLL_PROCESS_DETACH: CloseS;


Хрень какая-то ...

Хост-приложение вызвало экп.процедуру CloseS(), при этом файл f был закрыт.
Теперь хост-приложение выгружает библ-ку, в рез-те на строчке writeln(..) осуществляется попытка обращения к УЖЕ закрытому файлу.

??


Углук   (2007-03-05 13:55:00) [27]

Да еще : замечено в процессе отладки,  что напротив строки

writeln(f,DateTimeToStr(Now));


Процедуры CloseS  не ставится этакая синяя точка, которая показывает, останавливается ли тут полоска трассировки


Углук   (2007-03-05 13:53:00) [28]

Вызывающий код (из Host проекта вышеуказанной DLL):

var
 Form1: TForm1;
 Hinstance1:DWORD;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Hinstance1:=LoadLibrary('Project2.dll');
RunL;
FreeLibrary(Hinstance1);


Сергей М.   (2007-03-05 13:50:00) [29]

Ну а где вызывающий код ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо