Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Инициализация 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]

Какое еще нахрен "присваивание" ?

Речь идет совсем о другом  - о логикезагрузки образа модуля в АП процессаа и логике вызова процедуры инициализации этого модуля ..


Наверх

Титульная страница Поиск, карта сайта Написать письмо