![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Инициализация DLL
SpellCaster © (2008-11-21 18:55:00)Набрел в хелпе на описание DllProc, якобы она позволит ловить моменты загрузки и выгрузки библиотеки. Это мне было бы очень удобно, не надо размазывать строки инициализации и финализации и экспортировать процедуру завершения. Однако почему-то она не ловит момент загрузки.
Код:
procedure DLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH : // библиотека загружается
begin
ExitCode := -1;
... читаем настройки ...
ExitCode := 0;
end;
DLL_PROCESS_DETACH : // библиотека выгружается
begin
... освобождаем память ...
end;
end;
end;
begin
DllProc := @DLLHandler;
end.
На FreeLibrary процедура выполняется с параметром DLL_PROCESS_DETACH. Но на LoadLibrary - не хочет, хотя присваивание происходит. Есть подозрение, что DLL_PROCESS_ATTACH вызывается до присваивания, хотя какой тогда в нем толк - непонятно. Что можете посоветовать?
Anatoly Podgoretsky (2008-11-24 12:04:00) [1]> Сергей М. (24.11.2008 11:17:17) [17]
Вообще то я не стал бы брать за истину перевод UNIT как МОДУЛЬ, только в жаргонном смысле.
Unit - единица, блок
Модуль - module
Вот именно, что перевод типа ПОТОК
Сергей М. (2008-11-24 11:17:00) [2]
> SpellCaster (24.11.08 11:08) [15]
> модуль - перевод термина "юнит"
Юнит - модуль проекта, если уж на то пошло.
Вот чтобы не было путаницы, в паре с термином "модуль" как раз и следует упоминать либо процесслибо проект.
Равно как и поток кода- это тред, в то время как поток данных- это стрим.
Поросенок Винни-Пух (2008-11-24 11:10:00) [3]library MyDll;
.....
begin
DllProc := @MyDLLProc;
MyDLLProc(DLL_PROCESS_ATTACH);
end.
SpellCaster (2008-11-24 11:08:00) [4]> Они отродясь были для юнитов в составе проекта
Подразумевалось, что модуль - перевод термина "юнит".
> [11] Германн © (23.11.08 00:55)
Ну да, а что делать. Вырос на Фаронове, в те времена было еще принято переводить все термины. Та же самая путаница, что и с потоками-stream / потоками-thread.
Германн (2008-11-23 21:41:00) [5]
> GrayFace © (23.11.08 05:28) [12]
>
> Почему? Разве что-то, кроме юнитов, называют модулями?
Это идёт из терминологии Windows. Вот пример из справки:
HMODULE GetModuleHandle(
LPCTSTR lpModuleName // address of module name to return handle for
);
Parameters
lpModuleName
Points to a null-terminated string that names a Win32 module(either a .DLL or .EXE file).
Сергей М. (2008-11-23 19:12:00) [6]
> GrayFace © (23.11.08 05:28) [12]
> dll отродясь не было модулем
DLL становится модулем будучи загруженной в АП процесса.
GrayFace (2008-11-23 05:28:00) [7]Почему? Разве что-то, кроме юнитов, называют модулями?
(dll отродясь не было модулем. Это библиотека.)
Германн (2008-11-23 00:55:00) [8]
> SpellCaster (22.11.08 21:47) [9]
Какая путаница в терминологии!
:(
> Сергей М. © (22.11.08 22:05) [10]
>
> dll - это модуль, результат сборки проекта, который может
> включать ноль или более юнитов.
>
Согласен абсолютно. Но во многих книжках с времён царя Гороха термин модуль используется вместо термина юнит. Увы это приводит к непониманию. Хорошо ещё не привело (пока) к "Вавилонское столпотворение - 2"! :)
Сергей М. (2008-11-22 22:05:00) [9]
> секции отродясь были для модулей
Они отродясь были для юнитовв составе проекта.
> dll - это проект
dll - это модуль, результат сборки проекта, который может включать ноль или более юнитов.
SpellCaster (2008-11-22 21:47:00) [10]
> Механизм секций initialization и finalization для библиотек
> DLL
Может, я что-то не так понимаю, но эти секции отродясь были для модулей. А dll - это проект. Разве нет?
Или ты имеешь в виду модули, подключаемые к либе? У меня такого нет, все в одном файле.
> Что значит "размазывать строки инициализации и финализации"
Это значит иниц-ю в begin..end, фин-ю в экспортируемую Finalize, да еще и следить, чтобы она была вызвана. С Dllproc все гораздо удобнее
Leonid Troyanovsky (2008-11-22 00:27:00) [11]
> Loginov Dmitry © (21.11.08 23:52) [7]
Взгляд, конечно, варварский, но верный.
--
Regards, LVT.
Loginov Dmitry (2008-11-21 23:52:00) [12]> Это мне было бы очень удобно, не надо размазывать строки
> инициализации и финализации и экспортировать процедуру завершения.
Что значит "размазывать строки инициализации и финализации"? Механизм секций initialization и finalization для библиотек DLL основан на тех же DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, только реализован в более удобной форме, и код PAS-модуля работает одинаково, будь он скомпилирован в EXE, или в DLL. Отдельные экспортные процедуры для инициализации DLL и для ее финализации вреда не принесут. В некоторых случаях без них не обойтись. Как пример: сложность завершения дополнительных потоков в секции finalization (DLL_PROCESS_DETACH) DLL, и особенности запуска дополнительных потоков в секции initialization (DLL_PROCESS_ATTACH) DLL.
SpellCaster (2008-11-21 19:45:00) [13]> разве ЭТО не очевидно ?
Оооо, вот до этого я не допёр :) пятница, вечер, что поделать... спасибо, старче :)
Сергей М. (2008-11-21 19:38:00) [14]
> прицепиться к событию загрузки библиотеки не получится?
Здрасьте фаберже !!)
Сам факт получения управления при выполнении того самого присваивания и есть факт загрузки библ-ки в твойпроцесс !
Чего еще надобно-то, старче ?)
> зачем тогда вообще нужно описывать константу DLL_PROCESS_ATTACH?
>
>
А вот зачем:
procedure DLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH : // библиотека загружается
begin
...
end;
DLL_PROCESS_DETACH : // библиотека выгружается
begin
...
end;
end;
end;
begin
DllProc := @DLLHandler;
DLLHandle(DLL_PROCESS_ATTACH);
разве ЭТО не очевидно ?
SpellCaster (2008-11-21 19:32:00) [15]Хм. То есть прицепиться к событию загрузки библиотеки не получится? А зачем тогда вообще нужно описывать константу DLL_PROCESS_ATTACH?
Сергей М. (2008-11-21 19:27:00) [16]Присваивание.
Но оно выполняется как раз при вызове ф-ции иниц-ции модуля с параметром DLL_PROCESS_ATTACH
SpellCaster (2008-11-21 19:19:00) [17]> Какое еще нахрен "присваивание" ?
Вот это DllProc := @DLLHandler; разве не присваивание?
Сергей М. (2008-11-21 19:05:00) [18]Какое еще нахрен "присваивание" ?
Речь идет совсем о другом - о логикезагрузки образа модуля в АП процессаа и логике вызова процедуры инициализации этого модуля ..