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

Вниз

Запуск процедуры из DLL при клике   Найти похожие ветки 

 
AntonXXX   (2005-11-15 21:10) [0]

var
   b : TButton;
   h : THandle;
   proc : procedure;
...

procedure TForm1.FormShow(Sender: TObject);
begin
   b := TButton.Create(Self);
   b.Parent := Self;
   b.Left := 10;
   b.Top := 10;
   b.Caption := "MyButton";
   h := LoadLibrary("Test.dll");
   proc := GetProcAddress(h, "DoBeep");
   FreeLibrary(h);
end;
...
Как сделать, чтобы при клике на кнопку b выполнялась процедура DoBeep?


 
TUser ©   (2005-11-15 21:20) [1]

@proc:=getprocaddress
и дальше пишешь proc (параметры)


 
begin...end ©   (2005-11-15 21:22) [2]

> AntonXXX   (15.11.05 21:10)

var
 M: TMethod;
begin
 M.Code := @proc;
 M.Data := nil;
 b.OnClick := TNotifyEvent(M);
 ...
end.

Если внутри процедуры предполагается использовать Sender (объект, вызвавший событие), то её следует описать как procedure(Self, Sender: TObject).


 
Digitman ©   (2005-11-16 09:18) [3]


> begin...end ©   (15.11.05 21:22) [2]


> её следует описать как procedure(Self, Sender: TObject).


это неправильно.

Self-параметр передается неявно через регистр ebx, и к Sender"у он не имеет ни малейшего отношения


 
Leonid Troyanovsky ©   (2005-11-16 09:29) [4]


> Digitman ©   (16.11.05 09:18) [3]

> Self-параметр передается неявно через регистр ebx, и к Sender"у
> он не имеет ни малейшего отношения


Under the register convention, Self behaves as if it were declared before all other parameters. It is therefore always passed in the EAX register.

--
Regards, LVT.


 
Digitman ©   (2005-11-16 09:59) [5]


> Leonid Troyanovsky ©   (16.11.05 09:29) [4]


да, верно, именно через eax, а не через ebx


begin...end ©   (15.11.05 21:22) [2]


приношу извинения.
для экспортируемой/импортируемой регулярной процедуры форм.параметр Self действительно следует первым и явно.


 
Amoeba ©   (2005-11-16 10:42) [6]


> procedure TForm1.FormShow(Sender: TObject);
> begin
>    b := TButton.Create(Self);
>    b.Parent := Self;
>    b.Left := 10;
>    b.Top := 10;
>    b.Caption := "MyButton";
>    h := LoadLibrary("Test.dll");
>    proc := GetProcAddress(h, "DoBeep");
>    FreeLibrary(h);
> end;

Зачем нужно здесь выгружать DLL? Как тогда вызовешь свою процедуру из DLL при нажатии кнопки?



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

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
2-1132914567
serko
2005-11-25 13:29
2005.12.11
Шифровка!


2-1133194800
newlogin
2005-11-28 19:20
2005.12.11
куда мне с компилятором


14-1132580983
Kerk
2005-11-21 16:49
2005.12.11
Серебрянный матч. Как это было.


4-1129112792
FANAT
2005-10-12 14:26
2005.12.11
Как определить что вставлена флешка?


14-1132413148
syte_ser78
2005-11-19 18:12
2005.12.11
маленькая игрушка стрелялка