Форум: "Основная";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];
ВнизИнициализация DLL Найти похожие ветки
← →
SpellCaster (2008-11-21 18:55) [0]Набрел в хелпе на описание 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 вызывается до присваивания, хотя какой тогда в нем толк - непонятно. Что можете посоветовать?
← →
Сергей М. © (2008-11-21 19:05) [1]Какое еще нахрен "присваивание" ?
Речь идет совсем о другом - о логике загрузки образа модуля в АП процессаа и логике вызова процедуры инициализации этого модуля ..
← →
SpellCaster (2008-11-21 19:19) [2]> Какое еще нахрен "присваивание" ?
Вот это DllProc := @DLLHandler; разве не присваивание?
← →
Сергей М. © (2008-11-21 19:27) [3]Присваивание.
Но оно выполняется как раз при вызове ф-ции иниц-ции модуля с параметром DLL_PROCESS_ATTACH
← →
SpellCaster (2008-11-21 19:32) [4]Хм. То есть прицепиться к событию загрузки библиотеки не получится? А зачем тогда вообще нужно описывать константу DLL_PROCESS_ATTACH?
← →
Сергей М. © (2008-11-21 19:38) [5]
> прицепиться к событию загрузки библиотеки не получится?
Здрасьте фаберже !!)
Сам факт получения управления при выполнении того самого присваивания и есть факт загрузки библ-ки в твой процесс !
Чего еще надобно-то, старче ?)
> зачем тогда вообще нужно описывать константу 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:45) [6]> разве ЭТО не очевидно ?
Оооо, вот до этого я не допёр :) пятница, вечер, что поделать... спасибо, старче :)
← →
Loginov Dmitry © (2008-11-21 23:52) [7]> Это мне было бы очень удобно, не надо размазывать строки
> инициализации и финализации и экспортировать процедуру завершения.
Что значит "размазывать строки инициализации и финализации"? Механизм секций initialization и finalization для библиотек DLL основан на тех же DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, только реализован в более удобной форме, и код PAS-модуля работает одинаково, будь он скомпилирован в EXE, или в DLL. Отдельные экспортные процедуры для инициализации DLL и для ее финализации вреда не принесут. В некоторых случаях без них не обойтись. Как пример: сложность завершения дополнительных потоков в секции finalization (DLL_PROCESS_DETACH) DLL, и особенности запуска дополнительных потоков в секции initialization (DLL_PROCESS_ATTACH) DLL.
← →
Leonid Troyanovsky © (2008-11-22 00:27) [8]
> Loginov Dmitry © (21.11.08 23:52) [7]
Взгляд, конечно, варварский, но верный.
--
Regards, LVT.
← →
SpellCaster (2008-11-22 21:47) [9]
> Механизм секций initialization и finalization для библиотек
> DLL
Может, я что-то не так понимаю, но эти секции отродясь были для модулей. А dll - это проект. Разве нет?
Или ты имеешь в виду модули, подключаемые к либе? У меня такого нет, все в одном файле.
> Что значит "размазывать строки инициализации и финализации"
Это значит иниц-ю в begin..end, фин-ю в экспортируемую Finalize, да еще и следить, чтобы она была вызвана. С Dllproc все гораздо удобнее
← →
Сергей М. © (2008-11-22 22:05) [10]
> секции отродясь были для модулей
Они отродясь были для юнитов в составе проекта.
> dll - это проект
dll - это модуль, результат сборки проекта, который может включать ноль или более юнитов.
← →
Германн © (2008-11-23 00:55) [11]
> SpellCaster (22.11.08 21:47) [9]
Какая путаница в терминологии!
:(
> Сергей М. © (22.11.08 22:05) [10]
>
> dll - это модуль, результат сборки проекта, который может
> включать ноль или более юнитов.
>
Согласен абсолютно. Но во многих книжках с времён царя Гороха термин модуль используется вместо термина юнит. Увы это приводит к непониманию. Хорошо ещё не привело (пока) к "Вавилонское столпотворение - 2"! :)
← →
GrayFace © (2008-11-23 05:28) [12]Почему? Разве что-то, кроме юнитов, называют модулями?
(dll отродясь не было модулем. Это библиотека.)
← →
Сергей М. © (2008-11-23 19:12) [13]
> GrayFace © (23.11.08 05:28) [12]
> dll отродясь не было модулем
DLL становится модулем будучи загруженной в АП процесса.
← →
Германн © (2008-11-23 21:41) [14]
> 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).
← →
SpellCaster (2008-11-24 11:08) [15]> Они отродясь были для юнитов в составе проекта
Подразумевалось, что модуль - перевод термина "юнит".
> [11] Германн © (23.11.08 00:55)
Ну да, а что делать. Вырос на Фаронове, в те времена было еще принято переводить все термины. Та же самая путаница, что и с потоками-stream / потоками-thread.
← →
Поросенок Винни-Пух © (2008-11-24 11:10) [16]library MyDll;
.....
begin
DllProc := @MyDLLProc;
MyDLLProc(DLL_PROCESS_ATTACH);
end.
← →
Сергей М. © (2008-11-24 11:17) [17]
> SpellCaster (24.11.08 11:08) [15]
> модуль - перевод термина "юнит"
Юнит - модуль проекта, если уж на то пошло.
Вот чтобы не было путаницы, в паре с термином "модуль" как раз и следует упоминать либо процесс либо проект.
Равно как и поток кода - это тред, в то время как поток данных - это стрим.
← →
Anatoly Podgoretsky © (2008-11-24 12:04) [18]> Сергей М. (24.11.2008 11:17:17) [17]
Вообще то я не стал бы брать за истину перевод UNIT как МОДУЛЬ, только в жаргонном смысле.
Unit - единица, блок
Модуль - module
Вот именно, что перевод типа ПОТОК
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c