|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Использование CallBack функций в Dll
Доброго времени суток. Знающие люди подскажите пожалуйста, как реализовать обмен данными между приложением и 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)
|