|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Передача строки из формы 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. Код:
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. Код:
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; Последний раз редактировалось Voron, 06.10.2011 в 20:27. Причина: Добавление вложенного архива |
#2
|
|||
|
|||
По умолчанию Application.MainForm = nil. Из-за этого и возникает ошибка:
Код:
if Application.MainForm.GetInterface(... MainForm становится отличным от nil при создании первой формы с помощью метода Application.CreateForm(...). Последний раз редактировалось Lucky192, 10.10.2011 в 16:45. |