Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.29;
Скачать: CL | DM;

Вниз

Инициализация 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
15-1254472377
@!!ex
2009-10-02 12:32
2009.11.29
Как работает Hamachi?


15-1254496978
Германн
2009-10-02 19:22
2009.11.29
Название контакта датчика


15-1253862387
Ирг
2009-09-25 11:06
2009.11.29
запрос SQL


2-1255353949
Vitaly38
2009-10-12 17:25
2009.11.29
Сортировка массива


1-1225824956
vik2008
2008-11-04 21:55
2009.11.29
Кодировка в RX Lib