Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

Load/Free DLL   Найти похожие ветки 

 
Poirot   (2003-07-08 12:33) [0]

Есть такая фича:
Если функции из ДЛЛ импортировать прямо в имплементатионе через external -> то при загрузке проги в DLLMain передаётся DLL_PROCESS_ATTACH в качестве второго параметра... а при выгрузки проги похоже DLL_PROCESS_DETACH не происходит! ЧТо происходит с ДЛЛ!
Ну а если юзать LoadLibrary и FreeLibrary - то всё OK! Атач и деатач выполняются как часы!!!
Что есть причина ЭТОГО?


 
Digitman   (2003-07-08 12:44) [1]

приведи-ка код, инициализирущий DLLProc и обрабатывающий далее события DLL_PROCESS/THREAD_ATTACH/DETACH


 
Poirot   (2003-07-08 12:48) [2]

Либ на Ц++ написана! Вам оба куска дельфи вызов и Cpp DLL?


 
Poirot   (2003-07-08 12:51) [3]

Сишная БЛЛ

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0, "DLL_PROCESS_ATTACH", "DLL_PROCESS_ATTACH", 1);
break;

case DLL_THREAD_ATTACH:
MessageBox(0, "DLL_THREAD_ATTACH", "DLL_THREAD_ATTACH", 1);
break;

case DLL_THREAD_DETACH:
MessageBox(0, "DLL_THREAD_DETACH", "DLL_THREAD_DETACH", 1);
break;

case DLL_PROCESS_DETACH:
MessageBox(0, "DLL_PROCESS_DETACH", "DLL_PROCESS_DETACH", 1);
break;
default:
MessageBox(0, "DEFAULT", "DEFAULT", 1);
break;

}
return TRUE;
}


Делфийный кусок...


TDLLFunc = function (d:integer):integer; stdcall;

var
Form1: TForm1;

function About(d:integer):integer;

implementation

//function PAV_About(d:integer):integer; external "www.dll" name "About";
{$R *.dfm}

var
a:TDLLFunc;
h:THandle;

procedure TForm1.Button1Click(Sender: TObject);
begin
if (h = 0) then begin
h := LoadLibrary("www.dll");
a := GetProcAddress(h, "About");
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if(h <> 0) then
Caption:=IntToStr(a(10));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if (h <> 0) then begin
FreeLibrary(h);
h := 0;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
h := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if(h<>0) then
( h)
Сишная БЛЛ

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0, "DLL_PROCESS_ATTACH", "DLL_PROCESS_ATTACH", 1);
break;

case DLL_THREAD_ATTACH:
MessageBox(0, "DLL_THREAD_ATTACH", "DLL_THREAD_ATTACH", 1);
break;

case DLL_THREAD_DETACH:
MessageBox(0, "DLL_THREAD_DETACH", "DLL_THREAD_DETACH", 1);
break;

case DLL_PROCESS_DETACH:
MessageBox(0, "DLL_PROCESS_DETACH", "DLL_PROCESS_DETACH", 1);
break;
default:
MessageBox(0, "DEFAULT", "DEFAULT", 1);
break;

}
return TRUE;
}


Делфийный кусок...


TDLLFunc = function (d:integer):integer; stdcall;

var
Form1: TForm1;

function About(d:integer):integer;

implementation

//function PAV_About(d:integer):integer; external "www.dll" name "About";
{$R *.dfm}

var
a:TDLLFunc;
h:THandle;

procedure TForm1.Button1Click(Sender: TObject);
begin
if (h = 0) then begin
h := LoadLibrary("www.dll");
a := GetProcAddress(h, "About");
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if(h <> 0) then
Caption:=IntToStr(a(10));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if (h <> 0) then begin
FreeLibrary(h);
h := 0;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
h := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if(h<>0) then
FreeLibrary(h);
end;


 
Poirot   (2003-07-08 13:51) [4]

Any ideas????


 
Digitman   (2003-07-08 15:42) [5]

и ты при статической загрузке расчитываешь увидеть на экране результат вот этого

case DLL_PROCESS_DETACH:
MessageBox(0, "DLL_PROCESS_DETACH", "DLL_PROCESS_DETACH", 1);

???

да не увидишь никогда)

но ! поставь брейкпойнт на case DLL_PROCESS_DETACH и убедись, что оповещение о дитаче процесса библиотека получает в ЛЮБОМ из данных тобой случаев !


 
Poirot   (2003-07-08 16:17) [6]


> Digitman © (08.07.03 15:42)

Я вообще расчитываю увидеть хотябы по default!!!
Или принциписально он этого показать не может?


 
Digitman   (2003-07-08 16:24) [7]


> Poirot



> расчитываю увидеть хотябы по default


с какого, извиняюсь, хрену ?) никакого дифорnа в MSDN, кажись, на сей день нет)


> он этого показать не может


кто ОН ??? другой "ядерный" модуль ? который наравне с твоим www.dll выгружается при завершении приложения ? ты ж посредством MessageBox() пытаешься обратиться к "связке" из кучи зависимых друг от друга "ядерных" модулей, которые будут слать сообщения уже не реагирующему на очередь сообщений выгружаемому приложению)


 
Digitman   (2003-07-08 16:29) [8]


> Poirot


ты не занимайся ерундой-то) ... поставь брейкпойнт на case DLL_PROCESS_DETACH, поймай его и огласи всему миру, что "проблема" твоя не существует)


 
Poirot   (2003-07-08 16:41) [9]

mtt! нЕФИГА КРИЧАТЬ!
Поставил я бряки - блин всё OK! А именно что интересно было - почему не может вылезти окошко... а сейчас уже понятно!


 
Digitman   (2003-07-08 17:25) [10]


> Digitman


где ты видишь, что я повысил голос ?) не было такого)


> блин всё OK


давай уже без "блинов", если действительно хочешь разобраться.


> именно что интересно было - почему не может вылезти окошко


А вот в вопросе твоем отнюдь ничего не прозвучало про то, как ты обрабатываешь DLL_PROCESS_DETACH. Ты изначально задумался о следствиях, а не о причинах)... проигнорировав самый достоверный способ анализа причины - встроенную отладку)


 
Poirot   (2003-07-08 17:35) [11]

В данном случае я хотел проверитьт в каких случаях передаются какие значения! Меня интересовало именно то, что при выгрузке статически ничего не выводится,а динамически выводится... А отладку я мог сделать только по VC - коего у меня на работе нет, а была только ДЛЛ... Есть правда WinAsm - но про него забыл других сишных отладчиков нет...
За блины извиняюсь! - хотя вкусные бывают:)
А тогда можно каким либо способом заставить это окно вылетать? И ещё за одно - при каких условиях происходит тред(атач)деатач... судя по названию в потоках, но как? по идеи если потоков в проекте больше чем 1?




 
Digitman   (2003-07-09 09:16) [12]


> тогда можно каким либо способом заставить это окно вылетать?


ну а зачем ?) ты ж для экспериментальных целей только MessageBox() пытался вызвать, дабы убедиться в правильности своих представлений о последовательности возникновения того или иного вызова DllMain ? в релизе-то все равно уберешь MessageBox() оттуда..

вообще говоря, для целей отладки в таких ситуациях следует использовать отдельное приложение, загруженное в момент отладки, окну которого, например, можно будет послать (вместо MessageBox) некое сообщение с текстом, который требуется вывести на экран. Приложение такое сотряпать за полчаса - без проблем.


> при каких условиях происходит тред(атач)деатач


Эти события возникают, когда LoadLibrary()/ FreeLibrary() вызываются в любом из доп.код.потоков процесса.
Динамический же вызов LoadLibrary()/ FreeLibrary() в осн.код.потоке процесса, равно как и статическая загрузка/выгрузка библ-ки, вызывает process_attach/detach


 
Polevi   (2003-07-09 09:53) [13]

2Digitman © (09.07.03 09:16)
>Эти события возникают, когда LoadLibrary()/ FreeLibrary()
>вызываются в любом из доп.код.потоков процесса.

они возникают при старте и завершении доп. кодовых потоков в процессе в ВАП которого загружена библиотека


 
Polevi   (2003-07-09 09:57) [14]

PS
а вообще мы оба правы :)


 
Digitman   (2003-07-09 10:24) [15]


> Polevi


эт точно)


цитата для автора :

Note that a DLL"s entry-point function is called with this value only by threads created after the DLL is attached to the process. When a DLL is attached by LoadLibrary, existing threads do not call the entry-point function of the newly loaded DLL.


 
Poirot   (2003-07-09 11:09) [16]

Мучо грасиас!!!


 
pasha676   (2003-07-09 11:41) [17]


> где ты видишь, что я повысил голос ?) не было такого)

офfтопик конечно. Но фраза супер!



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.018 c
1-71594
slva
2003-09-09 18:00
2003.09.22
Русификация


1-71635
Шустрый
2003-09-09 11:17
2003.09.22
Третье по счёту число из пятизначного числа


3-71490
Sword
2003-09-01 17:24
2003.09.22
Распечатать содержимое DBTree


1-71642
Vitalik
2003-09-08 21:26
2003.09.22
создание формы


3-71509
Eagle Owl
2003-08-30 00:28
2003.09.22
Добавление поля к таблице





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский