Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.005 c
2-1255072442
novai
2009-10-09 11:14
2009.11.29
Работа с указателями


3-1230180063
ganda
2008-12-25 07:41
2009.11.29
Firebird и индексы


15-1249471484
pasha_golub
2009-08-05 15:24
2009.11.29
Игрушки


2-1255601111
xyz
2009-10-15 14:05
2009.11.29
где ошибка в запросе?


2-1255507653
123123
2009-10-14 12:07
2009.11.29
отключить сочетание клавиш





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский