![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Доброго времени суток. Знающие люди подскажите пожалуйста, как реализовать обмен данными между приложением и Dll библиотекой.
К примеру загружаю DLL, в ней есть форма, на форме кнопка, с нажимаю на кнопку, а в вызывающем приложении срабатывет какая-нибудь функция или процедура. Слышал, что реализация делается с помощью CallBack функции, что нужно передать указатель на неё в DLL, но я что-то не очень все это представляю. Буду благодарен за любую помощь! |
|
#2
|
||||
|
||||
|
для начала просвети на всякий случай: а для чего нужна в данном случае библиотека и почему форму нельзя сразу поместить в исполняемый файл?
|
|
#3
|
||||
|
||||
|
Цитата:
|
|
#4
|
||||
|
||||
|
DLL экспортирует функцию, одним из параметров которой является необходимая CallBack функция
Код:
type
TSomeCallBack=function (SomeParam:byte):BOOL;stdcall;
.......
function SomeFunction (SomeParam:byte;CallBack:TSomeFunction):BOOL;
begin
Result:=(SomeParam=$FF);
if Result then
CallBack(SomeParam);
end;
........
export
SomeFunction; как-то так, но имхо лучше интерфейсы |
| Этот пользователь сказал Спасибо cotseec за это полезное сообщение: | ||
Voron (22.03.2012)
| ||
|
#5
|
|||
|
|||
|
Можно еще через сообщения. В Dll регистрируется окно для сообщений, и она посылает ему сообщения по мере надобности
|
| Этот пользователь сказал Спасибо ChinYan за это полезное сообщение: | ||
Voron (22.03.2012)
| ||
|
#6
|
||||
|
||||
|
exe:
Код:
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure CB(Sender: TObject);
end;
function ShowForm(Sender: TNotifyEvent): Integer; external 'Project2.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowForm(CB);
end;
procedure TForm1.CB(Sender: TObject);
begin
ShowMessage(TEdit(TForm(Sender).FindComponent('Edit1')).Text);
end;dll: Код:
library Project2;
uses
Forms,
SysUtils,
Classes,
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
function ShowForm(Sender: TNotifyEvent): Integer;
begin
Form2:=TForm2.Create(Application);
Form2.CB:=Sender;
Result:=Form2.ShowModal;
Form2.Free;
end;
exports
ShowForm;
begin
end.dll form: Код:
type
TForm2 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
CB: TNotifyEvent;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
CB(Self);
end; |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Voron (23.03.2012)
| ||