![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск процедуры из DLL при клике [D7, WinXP]
AntonXXX © (2005-11-15 21:10:00)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?
Amoeba (2005-11-16 10:42:00) [1]
> 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 при нажатии кнопки?
Digitman (2005-11-16 09:59:00) [2]
> Leonid Troyanovsky © (16.11.05 09:29) [4]
да, верно, именно через eax, а не через ebx
begin...end © (15.11.05 21:22) [2]
приношу извинения.
для экспортируемой/импортируемой регулярной процедуры форм.параметр Self действительно следует первым и явно.
Leonid Troyanovsky (2005-11-16 09:29:00) [3]
> 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:18:00) [4]
> begin...end © (15.11.05 21:22) [2]
> её следует описать как procedure(Self, Sender: TObject).
это неправильно.
Self-параметр передается неявно через регистр ebx, и к Sender'у он не имеет ни малейшего отношения
begin...end (2005-11-15 21:22:00) [5]> 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).
TUser (2005-11-15 21:20:00) [6]@proc:=getprocaddress
и дальше пишешь proc (параметры)