Вопрос относительно использования технологии Plug-in в Delphi
вот код интерфейснго модуля
Код:
unit FileInterface;
interface
type
IAPI = interface
['{0F252623-FDFD-4F31-8198-217590C478E4}']
procedure IMessage(const msg:string);
procedure IErrMessage(const errmsg:string);
end;
IConvertor = interface
['{3DD00461-76F3-4BF6-9918-C198CCBA875B}']
procedure Init(const InFName:string; API:IAPI);
function Convert:boolean;
end;
implementation
end.
код простейшего plug-in в DLL
Код:
library ConvertHTML;
uses
Sharemem,SysUtils,Classes,FileInterface;
{$R *.res}
type
TConvertHTML = class (TInterfacedObject,IConvertor)
private
FAPI : IAPI;
FName : string;
InitSuccess : Boolean;
procedure Init(const InFName:string; API:IAPI);
function Convert:boolean;
public
destructor Destroy; override;
end;
{ TConvertHTML }
procedure TConvertHTML.Init(const InFName: string; API: IAPI);
begin
FAPI:=API;
FName:=InFName;
if FAPI <> nil then
begin
if FileExists(FName) then
begin
InitSuccess := true;
FAPI.IMessage('Инициализация прошла успешно');
end
else
begin
InitSuccess:=false;
FAPI.IErrMessage('Файл '+FName+' не найден или не существует');
FAPI:=nil;
end;
end;
end;
function TConvertHTML.Convert: boolean;
var i :integer;
_stime :string;
_saction :string;
_sIP :string;
_snamefile:string;
tmpstr :string;
CurPos :integer;
InF,OutF :TStringList;
begin
if InitSuccess then
begin
InF:=TStringList.Create;
InF.LoadFromFile(FName);
OutF:=TStringList.Create;
OutF.Add('<html>');
OutF.Add('<body>');
OutF.Add('<table border=2>');
OutF.Add('<tr>');
OutF.Add('<td bgcolor="#ff00ff">Time</td>');
OutF.Add('<td bgcolor="#ff00ff">IP</td>');
OutF.Add('<td bgcolor="#ff00ff">Action</td>');
OutF.Add('<td bgcolor="#ff00ff">Name</td>');
OutF.Add('</tr>');
i:=0;
repeat
tmpstr:=InF.Strings[i];
CurPos := Pos(';', tmpstr);
if (CurPos > 0) then
begin
_stime:=Copy(tmpstr, 1, Pred(CurPos));
tmpstr := Copy(tmpstr, CurPos + 1,
Length( tmpstr) - CurPos - 1 + 1);
end;
CurPos := Pos(';', tmpstr);
if (CurPos > 0) then
begin
_sIP:=Copy(tmpstr, 1, Pred(CurPos));
tmpstr := Copy(tmpstr, CurPos + 1,
Length( tmpstr) - CurPos - 1 + 1);
end;
CurPos := Pos(';', tmpstr);
if (CurPos > 0) then
begin
_saction:=Copy(tmpstr, 1, Pred(CurPos));
tmpstr := Copy(tmpstr, CurPos + 1,
Length( tmpstr) - CurPos - 1 + 1);
end;
CurPos := Pos(';', tmpstr);
if (CurPos > 0) then
begin
_snamefile:=Copy(tmpstr, 1, Pred(CurPos));
tmpstr := Copy(tmpstr, CurPos + 1,
Length( tmpstr) - CurPos - 1 + 1);
end
else
_snamefile:=tmpstr;
OutF.Add('<tr>');
OutF.Add('<td>'+_stime+'</td>');
OutF.Add('<td>'+_sIP+'</td>');
OutF.Add('<td>'+_saction+'</td>');
OutF.Add('<td>'+_snamefile+'</td>');
OutF.Add('</tr>');
inc(i);
until i = InF.Count;
FAPI.IMessage('файл '+FName+' преобразован');
FName:=ChangeFileExt(FName,'.html');
OutF.Add('</table>');
OutF.Add('</body>');
OutF.Add('</html>');
OutF.SaveToFile(FName);
InF.Free;
OutF.Free;
FAPI.IMessage('файл '+FName+' сохранен');
Result:=true;
end
else Result:=false;
end;
destructor TConvertHTML.Destroy;
begin
FAPI:=nil;
inherited;
end;
function CreateConvert:IConvertor;
begin
Result := TConvertHTML.Create;
end;
exports
CreateConvert ;
begin
end.
а вот тестовый пример использующий этот плагин
Код:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
ErrorMem: TMemo;
DataMem: TMemo;
procedure Button1Click(Sender: TObject);
private
procedure LoadData(FileName: String);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses FileInterface;
type
TAPI = class(TInterfacedObject, IAPI)
procedure IMessage(const msg:string);
procedure IErrMessage(const errmsg:string);
destructor Destroy; override;
end;
{ TAPI }
destructor TAPI.Destroy;
begin
inherited;
end;
procedure TAPI.IErrMessage(const errmsg: string);
begin
with (Application.MainForm as TForm1).ErrorMem do begin
Lines.Add(errmsg);
Update;
end;
end;
procedure TAPI.IMessage(const msg: string);
begin
with (Application.MainForm as TForm1).DataMem do begin
Lines.Add(msg);
Update;
end;
end;
type
TCreateConvertor = function : IConvertor;
{ TForm1 }
procedure TForm1.LoadData(FileName: String);
var
PluginName : String;
hPlugIn : THandle;
CreateConvertor : TCreateConvertor;
Convertor : IConvertor;
begin
PlugInName:=Edit1.Text;
hPlugIn := LoadLibrary(PChar(PluginName));
CreateConvertor := GetProcAddress(hPlugIn, 'CreateConvert');
if Assigned(CreateConvertor) then
begin
Convertor:=CreateConvertor;
try
Convertor.Init(FileName,TAPI.Create);
Convertor.Convert;
finally
Convertor:=nil;
end;
end;
FreeLibrary(hPlugIn);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
LoadData(OpenDialog1.FileName);
end;
end.
Если в кратце описать, что делает этот плаг - преобразует внутренний формат файла в формат HTML.
Дак вот проблема в том , что когда я вызываю из тестового примера
FreeLibrary(hPlugIn); прога вылетаеет с AV
Цитата:
Инструкция по адресу 0х00000000 обратилась к памяти по адресу 0х00000000. Память не может быть read
|
Поскажите пожалуйста в чем может быть дело. всю голову себе сломал уже. Заранее спасибо.