Форум: "Система";
Текущий архив: 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.017 c