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

Delphi Sources



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

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

Здравствуйте!!! Прошу помочь со следующей проблемой:
Имеется приложение и Dll библиотека. В приложении имеется компонент TMemo в Dll-ки имеется форма с размещенным на ней таким же компанентом TMemo, необходимо реализовать передачу текста Memo главного приложения в форму DLL библиотеки преобразовать ее и передать обратно в Memo главного приложения ну и реализовать обратную передачу. Пытаюсь проделать это все используя интерфейс, но все это падает с ошибкой Access Volation! Заранее спасибо!
Код интерфейса
Код:
unit InterfaceUnit;
 
interface
 
uses
  Classes;
 
type
  IPluginInterface = interface
  ['{34381143-4B31-11D8-8903-0020ED19BE94}']
     procedure Hello();
     function GetLocalString(): widestring;
     procedure SetLocalString(aStr: widestring);
  end;
 
implementation
 
end.
Реализация интерфейса IPluginInterface в приложении
Код:
uses
 ..., InterfaceUnit;
 
const
    StopString = 'Delphi Is Dead';
 
type
  TForm1 = class(TForm, IPluginInterface)
    LoadDLL: TButton;
    UnloadDLL: TButton;
    SetI: TButton;
    GetI: TButton;
    ShowDLLForm: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
   [...]
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Hello();
    function GetLocalString(): widestring;
    procedure SetLocalString(aStr: widestring);
  end;
 
var
  Form1: TForm1;
  [...]
implementation
 
{$R *.DFM}
 
var
 MyString: wideString; //строка которую будем изменять
 
procedure TForm1.Hello();
begin
 ShowMessage('Hello World!')
end;
 
function TForm1.GetLocalString(): widestring;
begin
 Result:=MyString;
end;
 
procedure TForm1.SetLocalString(aStr: widestring);
begin
 if pos(LowerCase(StopString),LowerCase(aStr))<=0 then
   MyString:=aStr
 else
   ShowMessage('Delphi живее всех живых!')
end;

procedure TForm1.LoadDLLClick(Sender: TObject);
var
 s: string;
begin
  s:=ExtractFilePath(ParamStr(0))+'Plugin.dll';
  DllHandle:=LoadLibrary(PChar(s));
  if DllHandle<>0 then
   begin
     @InitPlugin:=GetProcAddress(DllHandle, 'InitPlugin');
     if @InitPlugin<>nil then
      begin
        InitPlugin(Integer(Application));
        @DoForm:=GetProcAddress(DllHandle, 'DoForm');
        @FinishPlugin:=GetProcAddress(DllHandle, 'FinishPlugin');
      end;
     MessageDlg('Plugin.dll загружен!', mtInformation, [mbOk], 0);
   end
  else
   begin
     MessageDlg('Библитека Plugin.dll не загружена!', mtError, [mbOk], 0);
   end;
end;

procedure TForm1.ShowDLLFormClick(Sender: TObject);
var
 DLLForm: TForm;
begin
 if DllHandle<>0 then
  begin
    if @DoForm<>nil then
     begin
      DLLForm:=DoForm();
      DLLForm.Visible:=true;
     end;
  end;
end;

Код DLL
Код:
library Plugin;
 
uses
  ...
  InterfaceUnit in '..\InterfaceUnit.pas';
 
{$R *.RES}
 
var
  DA: TApplication;
 
procedure InitPlugin(App: Integer); StdCall;
begin
  DA:=Application;
  Application:=TApplication(App);
  if Application.MainForm.GetInterface(IPluginInterface,Plg) then
    ShowMessage('Ссылка на интерфейс получена')
  else
    ShowMessage('Не удалось получить ссылку на интерфейс!');
end;

function DoForm(): TForm; stdcall;
begin
  if Form2=nil then
   Form2:=TForm2.Create(Application);
  Result:=Form2;
end;

procedure FinishPlugin(); stdcall;
begin
 if Form2<>nil then
   FreeAndNil(Form2);
 Application:=DA;
end;
 
exports
  InitPlugin,
  DoForm,
  FinishPlugin;
 
begin
end.
Код формы DLL
Код:
uses ..., InterfaceUnit,
.........
var  Plg: IPluginInterface;
........
procedure TForm2.Button1Click(Sender: TObject);
begin
//изменяем переменную в главном приложении
  Plg.SetLocalString(Memo1.Text)
end;
 
procedure TForm2.Button2Click(Sender: TObject);
begin
//получаем значение MyString
  Memo1.Text:=Plg.GetLocalString
end;
 
procedure TForm2.Button3Click(Sender: TObject);
begin
//здороваемся с пользователем
  Plg.Hello;
end;
Вложения
Тип файла: rar Плагин.rar (183.7 Кбайт, 5 просмотров)

Последний раз редактировалось Voron, 06.10.2011 в 20:27. Причина: Добавление вложенного архива
Ответить с цитированием
  #2  
Старый 10.10.2011, 14:39
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

По умолчанию Application.MainForm = nil. Из-за этого и возникает ошибка:
Код:
if Application.MainForm.GetInterface(...

MainForm становится отличным от nil при создании первой формы с помощью метода Application.CreateForm(...).

Последний раз редактировалось Lucky192, 10.10.2011 в 16:45.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter