Тему про відстеження з середини DLL її приєднання до процесу та від'єднання можна знайти в сотнях статей. Наприклад, детально це розписано в блозі Gunsmoker'а. Але в більшості видно одну й ту ж саму помилку. А саме:
Реалізувавши таким чином бібліотеку можна бути впевненим, що основний код бібліотеки буде викликаний 4 рази на подіях:
Таким чином можна уникнути втрат пам'яті та виконання зайвого або навіть шкідливого в даній ситуації коду.
library MyDLL; procedure DllMain(Reason: Integer); begin { This is called when Reason = DETACH } end; begin { This executes when a process ATTACHes. } DllProc := @DllMain; end.
Реалізувавши таким чином бібліотеку можна бути впевненим, що основний код бібліотеки буде викликаний 4 рази на подіях:
- DLL_PROCESS_ATTACH = 1; // Executable attaches to DLL
- DLL_THREAD_ATTACH = 2; // Thread in exe calls DLL
- DLL_THREAD_DETACH = 3; // Thread leaves DLL
- DLL_PROCESS_DETACH = 0; // Exe detaches from DLL
library MyDLL; uses ...; var OldDllProc : TDLLProc; procedure DllMain(Reason: Integer); begin case Reason of DLL_PROCESS_ATTACH: begin OldDllProc := @DllProc; DllProc := @MyProc; end; DLL_PROCESS_DETACH: begin DllProc := OldDllProc; end; end; end; begin if (DllProc = nil) then DllMain(DLL_PROCESS_ATTACH); end.
Таким чином можна уникнути втрат пам'яті та виконання зайвого або навіть шкідливого в даній ситуації коду.
Немає коментарів :
Дописати коментар