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

Вниз

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

 
Demetrius2003   (2003-11-01 13:27) [0]

Здравствуйте!!!
Захотел разобраться с Dll, написал маленькую Дллелку

procedure DLLMain(Reason: Integer);stdcall;
begin
Messagebox(0,Pchar(inttostr(reason)),"",0);
end;


Но при загрузке єтой ДЛЛ никакой мески не появляется, как вообщем и при выгрузке :((((((

ПОЧЕМУ????


 
Digitman   (2003-11-01 13:32) [1]

потому что твоя процедура не вызывается


 
clickmaker   (2003-11-01 13:47) [2]

procedure DLLMain(dwReason: DWORD);
begin
end;

begin
DLLProc := @DLLMain;
end.


 
Demetrius2003   (2003-11-01 17:40) [3]

>clickmaker
Я так тоже пробовал, и так тоже не работает


 
Demetrius2003   (2003-11-01 17:42) [4]

> Digitman

Что вы имеете ввиду, можно поподробнее пожалуйста


 
HolACost!   (2003-11-01 17:48) [5]

Можно!
:)))
А ты скомпануй свой и вариант г-на clickmaker вполне рабочий результат!
Хотя с окнами могут быть проблемы :)))
или попробоуй вызвать её напрямую :))) но смысл названия меняется :)))


 
Adder   (2003-11-01 17:57) [6]

library CoolDll;
uses
.........................
exports ...............

function DllMain(fdwReason:DWORD):integer;
begin
case fdwReason of
DLL_PROCESS_ATTACH:
begin
// Что-то делаем
end;
DLL_PROCESS_DETACH:
begin
end;
DLL_THREAD_ATTACH:
begin
end;
DLL_THREAD_DETACH:
begin
end;
end;
Result:=1;
end;

begin
DllProc:=@DllMain;
// DllMain
DLLMain(DLL_PROCESS_ATTACH);
end.


 
Demetrius2003   (2003-11-01 18:04) [7]

> HolACost!

Компоновал , не помогает


 
Demetrius2003   (2003-11-01 18:10) [8]

>Adder

Мне то как раз когда подцепляется мало интересует, мне надо при выходе, а твой способ только на входе и то явным образом

begin
DllProc:=@DllMain;
// DllMain
DLLMain(DLL_PROCESS_ATTACH);
end.


 
Adder   (2003-11-01 18:22) [9]

Почему надо явно вызывать DllMain(DLL_PROCESS_ATTACH) ?
Дело в том, что функция _InitDll вызывается перед кодом инициализации. Это означает,
что когда посылается DLL_PROCESS_ATTACH, переменной DllProc еще не присвоено
значение; раз значение не присвоено, то и вызова со стороны _InitDll не будет.
После того, как отработает _InitDll, загружаются все модули проекта вместе со
всеми загружаемыми ими модулями. Наконец, исполняется код, заключенный между begin
и end. Он включает в себя присвоение глобальной переменной DllProc адреса DllMain
и затем формальный вызов DllMain(DLL_PROCESS_ATTACH).
После того, как присвоение адреса произошло, он остается действительным все время,
пока модуль отображается в адресное пространство процесса. Т.к. код инициализации
исполняется только один раз во время включения библиотеки в состав загружающего ее
процесса, не стоит опасаться многократного обращения к DllMain во время этого вызова.
После присвоения значения DllProc все будет выполняться правильно.Далее DllMain
будет вызываться автоматически.


 
Adder   (2003-11-01 18:22) [10]

Параметр fdwReason:DWORD содержит значение, соответствующее причине, по которой
была вызвана функция DllEntryPoint. Система вызывает DllEntryPoint в четырех
случаях; соответственно, fdwReason может иметь одно из четырех значений
DLL_PROCESS_ATTACH Процесс отображает DLL в своё адресное пространство
DLL_PROCESS_DETACH Процесс прекращает отображение DLL в своё адресное пространство
DLL_THREAD_ATTACH Создается поток в адресном пространстве процесса, отобразившего DLL
DLL_THREAD_DETACH Поток, находившийся в том же адресном пространстве, куда
отображена DLL, удаляется


 
panov   (2003-11-01 18:35) [11]

>Demetrius2003 © (01.11.03 18:10) [8]

А ты проверял?
Этот метод используют всегда.
Это именно особенность использования DLL в Borland Delphi, о чем известно давно.


 
Demetrius2003   (2003-11-01 19:08) [12]

>panov ©
Ну, конечно, я проверял: так при присоединении выводит меску, а при отсоединении нет :((
Может я её как то неправильно отсоединяю, как её нужно отсоединять, если не секрет конечно:))


 
Adder   (2003-11-01 20:08) [13]

Так... ну, проверяй -) Вот программа для явной загрузки -выгрузки DLL (Project3.dll) - форма и 2 кнопки

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
hDLLInst: LongWord;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var dwErr:DWORD;
begin
hDLLInst:=0;
hDllInst:=LoadLibrary("Project3.dll");
if hDLLInst=0 then
begin
dwErr:=GetLastError();
if (dwErr=ERROR_DLL_NOT_FOUND) or (dwErr=ERROR_MOD_NOT_FOUND) then {1157, 126}
ShowMessage("Error: " + IntToStr(dwErr)+
" не найдена DLL или требующийся ей модуль")
else
ShowMessage("Error: " + IntToStr(dwErr));
end;
end;

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

end.


 
Adder   (2003-11-01 20:11) [14]

А вот сама DLL

library Project3;

uses
Windows,SysUtils;
function DllMain(Reason:DWORD):integer;
begin
Windows.Messagebox(0,Pchar(IntToStr(reason)),"",0);
Result:=1;
end;

begin
DllProc:=@DllMain;
// DllMain
DLLMain(DLL_PROCESS_ATTACH);
end.


Экспериментируй -)


 
Demetrius2003   (2003-11-02 08:34) [15]

> Adder

Попробовал, и ... всеравно не работает.
Результат точно такой же , при нажатии на первую кнопку появляется единица, а при нажатии на вторую, ничего не происходит :((((
Вы хоть сами проверяли :)))
Может у меня, что-то с виндой не так, или может мы под разные версии Делфи пишем.

С ув. Demetrius

P.S. Вашу прогу я скопипастил от начала и доконца


 
Demetrius2003   (2003-11-02 11:59) [16]

Может проблема в том, что у меня Delphi unregistered


 
Ihor Osov'yak   (2003-11-02 12:45) [17]

2 Demetrius2003

Adder тебе вполне рабочий пример привела, должно все работать,
ну разве-что Button2Click я бы несколько в другой редакции сделал :-), но мой вариант никакого отношения к твоей проблеме не имеет:

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

А по существу: припоминаю, что на во времена или беты D6, или сразу после релиза бегала инфо о якобы баге вокруг DLL_PROCESS_DETACH, но я этого проверить не могу, так как D6 у меня сейчас с SP2. И на этом SP2 пример Адлер вполне работоспособен - что и следовало ожидать. Проверено.
Проверки с D5 не делал - так как в свое времмя очень активно с D5 работал с dll и никаких похожих проблем не наблюдал. С D6 проблем также не наблюдал, но с dll в d6 работал меньше и сразу же с SP1..

Зы - cделай построение DLL с отладочными DCU и протрассируй DLL в части обработки DLL_PROCESS_DETACH (часть трассировки придется делать по CtrlAltC) - может чего и отыщешь..


 
nikkie   (2003-11-02 14:51) [18]

некоторые люди утверждают, что есть такая проблема, см. здесь:
http://delphimaster.net/view/1-1067260216/
http://www.delphikingdom.com/stones/stone_07.htm

но я только что проверил - DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH вызывается нормально при компиляции и D5 upd1, и D6 upd2, и при implicit loading с помощью external и при explicit loading с помощью LoadLibrary. вероятно, как Игорь говорит, проблема была исправлена в апдейт-паках.


 
Adder   (2003-11-02 15:27) [19]

Ihor Osov"yak © (02.11.03 12:45) [17]
В данном конкретном примере
if hDLLInst<>0 then begin
FreeLibrary(hDLLInst);
hDLLInst := 0;
делать как-раз таки нельзя. Потому как никто не мешает давить на Button1 хоть 10 раз, тем самым увеличивая счетчик ссылок dll - а следовательно, DLL_PROCESS_DETACH получим только после такого же количества нажатий на Button2 (т.е. при каждом нажатии на Button2 уменьшается счетчик ссылок, но совсем не обязательно, что DLL выгружается) либо при закрытии приложения.
Т.е. если нажали на Button1 больше одного раза подряд, а после первого же нажатия на Button2 Обнулим hDLLInst - что получим ? -))


 
Nick Denry   (2003-11-02 15:36) [20]

блин. Либо лыжи не едут, либо я е....
Чем export; stdcall не подходит для длл
и export для exe....?

Грузи хоть динамически, хоть статически....


 
Demetrius2003   (2003-11-02 16:57) [21]

>Ihor Osov"yak ©
>nikkie ©

Спасибо, а то я уже начинал думать, что проблема не в лыжах :)))


 
Demetrius2003   (2003-11-02 17:02) [22]

А Делфа у меня действительно старая.
Ещё раз спасибо, за сохраненные нервы



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

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

Наверх





Память: 0.53 MB
Время: 0.008 c
14-99772
}|{yk
2003-12-09 19:19
2003.12.30
Математические методы в научных исследованиях


3-99435
RMM58
2003-12-07 01:55
2003.12.30
в DBF из XML


14-99760
Soft
2003-12-06 20:57
2003.12.30
Организация ЛС стандарта 100BaseTX на базе 486 с шиной PCI.


1-99581
Denis
2003-12-17 16:33
2003.12.30
Как в DateTimePicker показать 1 число текущего месяца?


1-99562
Zmei
2003-12-17 23:31
2003.12.30
Свернуть





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