Здравствуйте!!! Прошу помочь со следующей проблемой:
Имеется приложение и 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;