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

Delphi Sources



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

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.12.2008, 17:27
LoDS LoDS вне форума
Прохожий
 
Регистрация: 09.12.2008
Сообщения: 10
Репутация: 10
По умолчанию Ребята помогите плз

Вопрос относительно использования технологии 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
Поскажите пожалуйста в чем может быть дело. всю голову себе сломал уже. Заранее спасибо.
Ответить с цитированием
 


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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