![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странность с вызовом функции из DLL
Углук © (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]Ну а где вызывающий код ?