Einzelnen Beitrag anzeigen

Benutzerbild von bjd
bjd

Registriert seit: 2. Apr 2006
Ort: Illertissen
4 Beiträge
 
Delphi XE3 Professional
 
#1

Interface in DLL -> Form wird nicht angezeigt

  Alt 20. Aug 2009, 17:21
Hallo,

ich verwende eine DLL, die im Prinzip ein Plugin dastellt. In dieser DLL befindet sich eine Form sowie eine Interface-Implementation. Wenn ich nun über mein Hauptprojekt die Form anzeigen lasse und ihr als Parent bspw. ein TabSheet oder ein Panel zuweise, wird sie nicht angezeigt. Beim TabSheet muss ich einfach auf eine andere Seite navigieren und dann wieder zurück und meine Form ist da - nur wieso? Der Test mit EDA hat ergeben, dass die Form nicht nur nicht angezeigt wird, sondern sich überhaupt nicht lokalisieren lässt - erzeugt wurde sie allerdings. Nach dieser verwirrenden Beschreibung hier der Code:
Das ist mein Interface:
Delphi-Quellcode:
     PSuSecBGInt = ^ISuSecBGInt;
     ISuSecBGInt = interface ['{62A88606-F5DC-4F25-A5B9-6C5E851A9CE9}']
       Procedure SetParent(Const AParent: TWinControl);
       Procedure TryClose;
       Function GetForm: TForm;
     end;
So steht es in der DLL:
Delphi-Quellcode:
  TSuSecBGInt = Class(TInterfacedObject, ISuSecBGInt)
  private
    AForm: TMainForm;
  public
    Procedure SetParent(Const AParent: TWinControl);
    Procedure TryClose;
    Function GetForm: TForm;
  end;

var ISuSec: ISuSecBGInt;

Procedure TSuSecBGInt.SetParent(Const AParent: TWinControl);
Begin
     AForm := TMainForm.Create(NIL);
     AForm.Parent := AParent; { ohne Parent wird die Form angezeigt! }
// AForm.SetBounds(0, 0, 585, 286); { egal ob ich diese Zeile habe oder nicht - es geht nicht! }
     AForm.Show;
End;

Procedure TSuSecBGInt.TryClose;
Begin
     If AForm <> NIL Then Begin
        AForm.Close;
        AForm.Free;
     End;
End;

Function TSuSecBGInt.GetForm: TForm;
Begin
     Result := AForm;
End;

Function GetPMI: PSuSecBGInt; Export;
Begin
     Result := @ISuSec;
End;

Exports GetPMI Name 'PMI';

begin
  ISuSec := TSuSecBGInt.Create;
end.
Der Aufruf ist ganz simpel. Im Hauptprogramm wurde die DLL-Funktion "GetPMI" eingebunden:
Function GetPMI1: PSuSecBGInt; External 'mod1.dllName 'PMI'; Anschließend:
Delphi-Quellcode:
var {Global}
  Plugins: Array[1..1] Of ISuSecBGInt;

Procedure Load1stPlugin;
Begin
     Plugins[1] := GetPMI1^;
     Plugins[1].SetParent(AParent);
End;

Procedure FormClose(...);
var
   I: Integer;
begin
     For I := Low(Plugins) To High(Plugins) Do
         Plugins[I].TryClose;
End;
  Mit Zitat antworten Zitat