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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.029 c
1-71724
Genri
2003-09-10 15:26
2003.09.22
переменная Path


14-71843
PVOzerski
2003-09-01 09:19
2003.09.22
Катастрофа с проектом FreePascal


4-71997
Karburator
2003-07-20 00:03
2003.09.22
Связь хука с создавшей его программой


14-71928
Lex
2003-08-28 13:49
2003.09.22
Как не запутаться в коде?


1-71636
Raper
2003-09-09 09:43
2003.09.22
Помогите перевести String в Char