Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск процедуры из 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 (параметры)


Наверх

Титульная страница Поиск, карта сайта Написать письмо