Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.734 c
4-1101400188
Ego
2004-11-25 19:29
2005.01.16
Комментарий к файлу


1-1104237367
Programmix
2004-12-28 15:36
2005.01.16
Пользовательский формат бумаги


1-1103828956
LedWorm
2004-12-23 22:09
2005.01.16
Пробег по элементам TreeView


1-1103098374
kingdom
2004-12-15 11:12
2005.01.16
Как найти пересечение фигур


14-1104219690
syte_ser78
2004-12-28 10:41
2005.01.16
Занимательная математика :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский