Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

DllEntryPoint( .. DLL_PROCESS_DETACH .. ) => finalization ?   Найти похожие ветки 

 
GuAV ©   (2004-12-29 21:41) [0]

Когда ОС вызывает DllEntryPoint с параметром DLL_PROCESS_DETACH, выполняется ли finalization модулей библиотеки или эти события не зависят друг от друга ?


 
Palladin ©   (2004-12-29 21:45) [1]

В общем то недолго проверить. Я не проверял, но считаю, что вызовется лишь при полной выгрузке библиотеки из памяти, таково назначение Finalization. Щаз проверю :)


 
Palladin ©   (2004-12-29 21:58) [2]

Так оно и есть.


 
GuAV ©   (2004-12-29 22:33) [3]

Т.е.

DLL_PROCESS_ATTACH is passed to the procedure only if the DLL’s initialization code calls the procedure and specifies DLL_PROCESS_ATTACH as a parameter

, но при этом финализация выполняется

> лишь при полной выгрузке библиотеки из памяти

?

Т.е. инициализация может вызыватся чаще чем финализация ? или что я не понимаю ?


 
Palladin ©   (2004-12-29 22:34) [4]

не путай initialization у юнита и initialization у библиотеки!


 
GuAV ©   (2004-12-29 22:44) [5]

Palladin ©   (29.12.04 22:34) [4]

То есть юнит не всегда инициализируется, когда выполняется begin...end в библиотеке ?


 
Palladin ©   (2004-12-29 22:47) [6]

Он инициализируется лишь раз. Финализируется точно столько же.


 
GuAV ©   (2004-12-29 22:55) [7]


> Он инициализируется лишь раз. Финализируется точно
> столько же

А begin...end из .dpr библиотеке - может выполнится больше одного раза ?

Т.е. код



procedure CloseGlobalData();
begin
 UnmapViewOfFile(GlobalData);
 CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
 case dwReason of
   DLL_PROCESS_ATTACH: OpenGlobalData;
   DLL_PROCESS_DETACH: CloseGlobalData;
 end;
end;

begin
 DLLProc:= @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


- неправилный ?

ps: Извините за тупость...


 
Palladin ©   (2004-12-29 23:02) [8]

Он правильный, но то ли ты от него ожидаешь, это другой вопрос.


 
GuAV ©   (2004-12-29 23:12) [9]

То есть, могут быть несколько вызовов
DllEntryPoint( .. DLL_PROCESS_ATTACH .. ), но после каждого обязательно будет вызов DllEntryPoint( .. DLL_PROCESS_DETACH .. ) ?


 
Palladin ©   (2004-12-29 23:27) [10]

DLLProc назначится только один раз, DLLEntryPoint будет вызыватся так как описано в справки WinAPI.


 
GuAV ©   (2004-12-29 23:41) [11]


> DLLProc назначится только один раз

Значит и DLLEntryPoint(DLL_PROCESS_ATTACH) вызовется только один раз, т.к.

DLL_PROCESS_ATTACH is passed to the procedure only if the DLL’s initialization code calls the procedure and specifies DLL_PROCESS_ATTACH as a parameter.

Тогда чем отличаются initialization у юнита и initialization у библиотеки в этом случае ?


 
Palladin ©   (2004-12-29 23:46) [12]


> Значит и DLLEntryPoint(DLL_PROCESS_ATTACH) вызовется только
> один раз, т.к.

В ручную ты сделаешь только один вызов. Все остальные вызовы делать будет система.
Сказал же, читай справку WinAPI\Index\DllEntryPoint.


 
GuAV ©   (2004-12-30 00:04) [13]

Прочита справку я понял, что
DllEntryPoint( ..., DLL_PROCESS_ATTACH, ... ) будет вызвано, когда dll будет присоединена к адресному пространству процесса. Причём если dll уже загружена в АП процесса, повторная попытка загрузить её не вызовет DllEntryPoint( ..., DLL_PROCESS_ATTACH, ... ).

в справке по Delphi написано
"DLL_PROCESS_ATTACH is passed to the procedure only if the DLL’s initialization code calls the procedure and specifies DLL_PROCESS_ATTACH as a parameter"

По поводу примера в [7] - не приводит ли более чем однократный вызов OpenGlobalData к утечке хендла в переменной MMFHandle ?


 
Palladin ©   (2004-12-30 00:18) [14]

Количество вызовов DllEntryPoint с DLL_PROCESS_DETACH будет соответствовать количеству вызовов с DLL_PROCESS_ATTACH.


 
GuAV ©   (2004-12-30 00:24) [15]

Palladin ©   (30.12.04 0:18) [14]

Это сомений не вызывает. Так всё-таки ошибка в справке Delphi по DllProc, что DLL_PROCESS_ATTACH вызывается только из инициализации Dll вручную ?

и будет ли утечка хендла MMFHandle из-за неоднократного вызова OpenGlobalData ?


 
Palladin ©   (2004-12-30 00:51) [16]


> вручную ?

Во первых. Где это в справке Delphi написано про "вручную"? Во вторых. Читай справку которую я тебе указал. Ты не туда смотришь.


 
GuAV ©   (2004-12-30 01:07) [17]


> Во первых. Где это в справке Delphi написано про
> "вручную"?


DLLProc + F1
смотрю Note


> Во вторых. Читай справку которую я тебе указал. Ты не
> туда смотришь.


DllEntryPoint - нобязательная входная точка для DLL. Если она есть то вызывается когда процесс/поток создан/завершен или LoadLibraty/FreeLibrary.

DLL_PROCESS_ATTACH
Указывает что DLL присоединяется к адресному протранству процесса.
При начальной загрузке процесса или после вызова LoadLibrary ОС сканирует список DLL для процесса.
Для тех DLL для которых не был сделан вызов с DLL_PROCESS_ATTACH он делается. Вызов делается в контексте потока, который привёл к изменению адресного процесса.

Что ещё я не увидел ??


 
Palladin ©   (2004-12-30 01:44) [18]

В общем то все увидел, что бы поразмышлять и поэкспериментировать.
В первый раз нужно вызвать в ручную. Все ты делаешь верно. Незакрытых дескрипторов не будет.


 
VMcL ©   (2004-12-30 07:38) [19]

>procedure DLLEntryPoint(dwReason: DWord); stdcall;

Кхм...
procedure DLLEntryPoint(dwReason: DWord); register;


 
GuAV ©   (2004-12-30 13:03) [20]

2 VMcL ©

спасибо. хотя у меня этой ошибки не было.
дело в том что я привёл не свой код, а пример из статьи по хукам.

2 Palladin ©

Провёл собственные эксперименты..

library mydll;

{$IMAGEBASE $24000000}

uses
 Windows,
 Messages,
 SysUtils,
 Unit1 in "Unit1.pas";

procedure LibraryProc(Reason: Integer);
begin
 case Reason of
   DLL_PROCESS_ATTACH: ShowMessage("ATTACH");
   DLL_PROCESS_DETACH: ShowMessage("DETACH");
 end;
end;

exports
 someproc;

begin
 ShowMessage(IntToHex(SysInit.HInstance, 8));
 ShowMessage("BEGIN");
 DllProc := LibraryProc;
 LibraryProc(DLL_PROCESS_ATTACH);
end.

--------------------------------------------

unit Unit1

interface

uses Windows, Messages;

procedure ShowMessage(s: string);

implementation

procedure ShowMessage(s: string);
begin
 MessageBox(0, PChar(s), 0, 0);
end;

initialization
 ShowMessage("INIT");
finalization
 ShowMessage("FINALIZE");
end.

==========================================

Создал несколько проектов с таким кодом

procedure TForm1.Button1Click(Sender: TObject);
begin
 Tag := LoadLibrary("hookdll.dll");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 FreeLibrary(Tag);
end;

всегда вызываются INIT - BEGIN - ATTACH при LoadLibrary и DETACH - FINALIZE при FreeLibrary.
Я что-то делаю не так ?


 
Palladin ©   (2004-12-31 00:01) [21]

Ну? Видишь, ты сам раскопал суть вопроса. Все ты так делаешь. Не бойся экспериментировать.

PS. Я ошибся в выводах, когда результаты нескольких вызовов LoadLibrary в одном и том же хостприложении обобщил как для разных хостприложений. Лень было несколько проектов создавать только ради ответа на один вопрос. :)


 
GuAV ©   (2004-12-31 00:46) [22]

Palladin ©   (31.12.04 0:01) [21]
результаты нескольких вызовов LoadLibrary в одном и том же хостприложении


Это тоже сейчас проверил. Да, при повторном LoadLibrary не запускается код в initialization. LibraryProc тоже не запускается. Как и ожидалось.

Кстати, по сабжу я получил ответ в borland.public.delphi.language.delphi.win32 .



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.044 c
1-1104350997
Алексей
2004-12-29 23:09
2005.01.16
Первая буква в слове.


1-1104749217
mega
2005-01-03 13:46
2005.01.16
мерцание в DrawItem ListView


14-1104244484
stud
2004-12-28 17:34
2005.01.16
1с и как с ней бороться))


3-1102930973
Tomkat
2004-12-13 12:42
2005.01.16
Halcyon Create DBF


1-1104070692
NEED_Help
2004-12-26 17:18
2005.01.16
kak sohranit jpg kartinku v bazu dannih ??