![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Dll, dll, dll.... [Win2k, WinXP]
Alive © (2004-07-08 12:35:00)Привет всем!
В свой DLL-ке я замещаю процедуру DllProc своей. Скажите мне, пожалуйста, почему не вызывается DLLProc с "ризоном" DLL_PROCESS_DETACH при явной выгрузке моей библиотеки из другой программы через FreeLibrary (Естественно я заранее ее туда "динамически" загрузил).
Какие идеи, мб кто-нибудь уже занимался этим сабжем? Как вообще определить, что моя DLL выгружается из адресного пространства другого процесса, не используя DllProc?
bar (2004-07-09 10:24:00) [21]>>Alive ©
DLL_PROCESS_ATTACH = 1; // Программа подключается к DLL
DLL_THREAD_ATTACH = 2; // Поток программы подключается к DLL
DLL_THREAD_DETACH = 3; // Поток "оставляет" DLL
DLL_PROCESS_DETACH = 0; // Exe "отсоединяется" от DLL
подробней см
http://delphiworld.narod.ru/base/threads_and_dll.html
Digitman (2004-07-09 08:25:00) [22]
> Alive © (09.07.04 07:28) [5]
убери stdcall !!
Alive (2004-07-09 07:33:00) [23]
> 1)TaskManager+ TaskManagerEx
> 2)Попробовать переименовать файл дллки (ежели занят, то
> не получится).
> 3)Использовать спец. проги для вывода инфы о процессах и
> т.п. гдето слышал о такой хорошей ,но не помню. Поищи в
> инете.
Не то! Мне нужно вызвать определенную процедуру в моей длл-ке, когда она будет выгружаться...
И вообще: если DLL подгружена в разные процессы, то DLL_PROCESS_DETACH будет вызываться всегда, когда хотя бы один процесс "освободит" DLL, или только когда необходимость в DLL отпадет совсем, т.е. когда она не будет загружена ни одним процессом? Понимаю, что первый вариант, так SDK написано...
Alive (2004-07-09 07:28:00) [24]......
procedure DLLEntryPoint(dwReason: DWORD); stdcall;
begin
case dwReason Of
DLL_PROCESS_ATTACH :
begin
MessageBox(0, PChar('DLL_PROCESS_ATTACH'), PChar('DLL'), MB_TOPMOST);
end;
DLL_PROCESS_DETACH:
begin
MessageBox(0, PChar('DLL_PROCESS_DETACH'), PChar('DLL'), MB_TOPMOST);
end
end;
end;
begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Вот код, на ATTACH работает, при загрузке, а при выгрузке нет!
Digitman (2004-07-08 16:09:00) [25]убери stdcall
bar (2004-07-08 15:45:00) [26]Получение списка DLL загруженных приложением
http://delphiworld.narod.ru/base/get_loaded_dll_list.html
bar (2004-07-08 15:23:00) [27]>>Alive © (08.07.04 12:35)
Я делаю примерно та и все работает.
....
procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports ...;
begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
>>Как вообще определить, что моя DLL выгружается из адресного пространства другого процесса, не используя DllProc?
1)TaskManager+ TaskManagerEx
2)Попробовать переименовать файл дллки (ежели занят, то не получится).
3)Использовать спец. проги для вывода инфы о процессах и т.п. гдето слышал о такой хорошей ,но не помню. Поищи в инете.
Digitman (2004-07-08 12:47:00) [28]
> Alive © (08.07.04 12:35)
быть того не может
покажи код