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

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

Load/Free DLL


Poirot ©   (2003-07-08 12:33:00) 

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


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


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

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


Poirot   (2003-07-09 11:09:00) [2]

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


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


> 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.


Polevi   (2003-07-09 09:57:00) [4]

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


Polevi   (2003-07-09 09:53:00) [5]

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

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


Digitman   (2003-07-09 09:16:00) [6]


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


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

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


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


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


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

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



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


> Digitman


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


> блин всё OK


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


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


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


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

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


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


> Poirot


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


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


> Poirot



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


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


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


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


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


> Digitman © (08.07.03 15:42)

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


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

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

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

???

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

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


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

Any ideas????


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

Сишная БЛЛ

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 12:48:00) [16]

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


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

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


Наверх

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