Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2012, 19:04
Аватар для Voron
Voron Voron вне форума
Новичок
 
Регистрация: 16.09.2010
Сообщения: 61
Репутация: 10
По умолчанию Использование CallBack функций в Dll

Доброго времени суток. Знающие люди подскажите пожалуйста, как реализовать обмен данными между приложением и Dll библиотекой.
К примеру загружаю DLL, в ней есть форма, на форме кнопка, с нажимаю на кнопку, а в вызывающем приложении срабатывет какая-нибудь функция или процедура. Слышал, что реализация делается с помощью CallBack функции, что нужно передать указатель на неё в DLL, но я что-то не очень все это представляю. Буду благодарен за любую помощь!
Ответить с цитированием
  #2  
Старый 22.03.2012, 19:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

для начала просвети на всякий случай: а для чего нужна в данном случае библиотека и почему форму нельзя сразу поместить в исполняемый файл?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 22.03.2012, 19:59
Аватар для Voron
Voron Voron вне форума
Новичок
 
Регистрация: 16.09.2010
Сообщения: 61
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
для начала просвети на всякий случай: а для чего нужна в данном случае библиотека и почему форму нельзя сразу поместить в исполняемый файл?
Это будут плагины, которые обрабатывают некоторый файл, форма для возможных конфигураций изменений в файле, а CallBack должна возвращать результат преобразоваеия в основное приложение.
Ответить с цитированием
  #4  
Старый 22.03.2012, 20:00
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

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  
Старый 22.03.2012, 20:07
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Можно еще через сообщения. В Dll регистрируется окно для сообщений, и она посылает ему сообщения по мере надобности
Ответить с цитированием
Этот пользователь сказал Спасибо ChinYan за это полезное сообщение:
Voron (22.03.2012)
  #6  
Старый 23.03.2012, 08:43
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

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;
Вложения
Тип файла: rar Project.dll.rar (3.1 Кбайт, 30 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Voron (23.03.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter