Einzelnen Beitrag anzeigen

Benutzerbild von dor557
dor557

Registriert seit: 24. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#19

Ergebnis bis jetzt !

  Alt 25. Aug 2007, 19:55
Also habe nun Lektüre gelesen und gemacht und getan und habe folgendes zusammen bekommen.

Hauptprogramm bestehend aus folgenden dateien :
MainF.pas
Interfaces.pas
filefinder.pas (werde ich aber mal nicht mit hinzufügen. denke sieht jeder selbst was der machen soll)

interfaces.pas :
Delphi-Quellcode:
unit interfaces;

interface
 uses classes, forms;
const
  IID_Plugin: TGUID = '{664AAC6B-BF3B-4539-8682-1C33AC692D62}';
  IID_PluginForm: TGUID = '{70B82481-A4E5-4E3F-BAF3-1697EA771FAD}';
  IID_App: TGUID = '{AC519934-9997-432C-9055-E80FD001F502}';

type
  IPlugin = Interface(IInterface)
    ['{664AAC6B-BF3B-4539-8682-1C33AC692D62}']
    function GetName: PChar; stdcall;
    function GetVersion: Integer; stdcall;
  End;

  IPluginForm = Interface(IInterface)
    ['{70B82481-A4E5-4E3F-BAF3-1697EA771FAD}']
  End;


implementation

end.
MainF.pas
Delphi-Quellcode:
unit MainF;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus, ActnList, interfaces, filefinder, inifiles;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Programm1: TMenuItem;
    Beenden1: TMenuItem;
    Plugin1: TMenuItem;
    ActionList1: TActionList;
    Action1: TAction;
    Memo1: TMemo;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Action1Execute(Sender: TObject);
  private
// app: IApp;
    hDLL : HWND;
    iPlg: IPlugin;
    iPlgForm : IPluginForm;
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  AktDll : Integer;
  ProgDir : String;
  LibDir : String;
implementation

{$R *.DFM}

procedure TForm1.Action1Execute(Sender: TObject);
type
  TProcInitPlg = function(PApp: TApplication; PForm: TForm): IPluginForm; stdcall;
var fProc: TProcInitPlg;
begin
  @fProc := GetProcAddress(hDLL, 'RunPlugin');
  if fProc(Application,Form1) <> nil then
  begin
    iPlgForm := fProc(Application,Form1);
  end;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
type
  TProcInitPlg = function: IPlugin; stdcall;
var
  fProc: TProcInitPlg;
  New_Entry_Plugin : TMenuItem;
begin
  ProgDir := extractfilepath(paramstr(0));
  LibDir := copy(ProgDir,0,Pos('bin',ProgDir)-1) + 'lib\';
  messageDlg('folgender Pfad wird durchsucht : ' + LibDir, mtInformation, [mbOK],0);
  Memo1.Lines := FindPlugins(LibDir);
  // Bibliothek laden und Interface holen
  messageDlg('Versuche folgende DLL zu laden : ' + LibDir + Memo1.Lines[0], mtInformation, [mbOK],0);
  hDll := LoadLibrary(PCHAR(libdir + Memo1.Lines[0]));
  @fProc := GetProcAddress(hDLL, 'InitPlugin');
  if fProc <> nil then
  begin
    iPlg := fProc;
    New_Entry_plugin := TMenuItem.Create(self);
    Action1.Caption := PCHAR(iPlg.GetName);
    New_Entry_Plugin.Action := Action1;
    Plugin1.Add(New_Entry_Plugin);
  end;


end;

procedure TForm1.FormDestroy(Sender: TObject);
var i : Integer;
begin
 // PlugIn zerstören
  iplg := nil;
  iPlgForm := nil;
 // Bibliothek entladen
  FreeLibrary(hDLL);
 // Application-Interface zerstören
// app := nil;
end;

end.
nun die dll :
kMain.pas
interfaces.pas
kundendaten.dpr / projektdatei

so nun erstmal die dpr
Delphi-Quellcode:
library Kundendaten;


uses
  SysUtils,
  Classes,
  forms,
  kMain in 'kMain.pas{KundendatenF},
  interfaces in '..\..\units\interfaces.pas';

{$E dll}

{$R *.res}

function InitPlugin: IPlugin; stdcall;
begin
  Result := TPlugin.Create;
end;

Function RunPlugin(pApp: TApplication; PForm: TForm) : IPluginForm; Stdcall;
var tmpForm : TPluginForm;
begin
  tmpForm := TPluginForm.create(pApp,PForm);
  Result := tmpForm;
end;

exports
  InitPlugin,
  RunPlugin;
begin
end.

die kMain.pas
Delphi-Quellcode:
unit kMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, interfaces;

type
  TKundendatenF = class(TForm)
    Button2: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TPluginForm = Class(TInterfacedObject, IPluginForm)
  private
    ClientForm : TKundendatenF;
  protected
  public
     constructor create(PApp: TApplication; PForm: TForm);
     destructor Destroy; override;
  End;

  TPlugin = class(TInterfacedObject, IPlugin)
  private
    function GetName: PChar; stdcall;
    function GetVersion: Integer; stdcall;
  protected
    // hier die Methoden von system.TInterfacedObject reinkopieren
  public

  end;

var
  KundendatenF: TKundendatenF;
  dllApp: TApplication;
  PluginForm : TPluginForm;

implementation

constructor TPluginForm.create(PApp: TApplication; PForm: TForm);
begin
  dllApp := Application;
  Application := PApp;
  ClientForm := TKundendatenF.Create(Application);
end;


destructor TPluginForm.Destroy;
begin
  ClientForm.free;
end;

{ TPlugin }
function TPlugin.GetName: PChar;
begin
  Result := '&Kundendaten'; // "T" unterstrichen im Menü
end;

function TPlugin.GetVersion: Integer;
begin
  Result := (1 shl 16) or 0; // 1.0
end;

{$R *.dfm}

procedure TKundendatenF.Button2Click(Sender: TObject);
begin
  close;
end;

procedure TKundendatenF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.
So Funktioniert auch so weit. Ich kann das Programm starten und das MDIChild öffnen. Alles super. Es wird auch korrekt geschlossen. Aber sobald ich das Programm Beenden möchte Gibt er mir eine Fehlermeldung raus.

Ich habe schon versucht mit verschiedenen mitteln denn ich denke das der grund hier ligt :

Delphi-Quellcode:
  dllApp := Application; <<----- Geschätzte uhrsache !!
  Application := PApp;
  ClientForm := TKundendatenF.Create(Application);
habe auch schon versucht das wieder an das Programm zurückzugeben aber ohne erfolg Macht keinen unterschied ! hat jemand einen Rat ?

Gruss Sascha
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat