Главная страница
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.053 c
2-1132602045
The Sound
2005-11-21 22:40
2005.12.11
Выключение ПК.


8-1121092399
arhey
2005-07-11 18:33
2005.12.11
изменение фмзичиского размера картинки


2-1132942763
дурачок
2005-11-25 21:19
2005.12.11
MP3


14-1132302421
_Vaitek
2005-11-18 11:27
2005.12.11
Сжатие данных "на лету"


4-1129133017
Alexei2134
2005-10-12 20:03
2005.12.11
Создание AVI из картинок