AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Interface in DLL -> Form wird nicht angezeigt
Thema durchsuchen
Ansicht
Themen-Optionen

Interface in DLL -> Form wird nicht angezeigt

Ein Thema von bjd · begonnen am 20. Aug 2009 · letzter Beitrag vom 20. Aug 2009
Antwort Antwort
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Interface in DLL -> Form wird nicht angezeigt

  Alt 20. Aug 2009, 17:23
Delphi Objekte im Interface einer Dll ist immer eine schlechte Idee
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Interface in DLL -> Form wird nicht angezeigt

  Alt 20. Aug 2009, 17:26
Du wirst gemeinsame Runtimepackages benötigen um einen einheitlichen Speichermanager und eine gemeinsame automatische Referenzzählung zu haben.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Interface in DLL -> Form wird nicht angezeigt

  Alt 20. Aug 2009, 17:33
Die Referenzzählung ist nicht das Problem. Das Problem dürfte eher sein, dass hier einfach so TWinControls durch die Gegend geschoben werden. Gib der SetParent Methode als Parameter mal ein HWnd statt einem TWinControl und verwende dann CreateParented.
Übrigens sind deine Pointereien unnötig. Du kannst GetPMI ohne Weiteres das globale ISuSec zurückgeben lassen, nicht nur dessen Adresse.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von bjd
bjd

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

Re: Interface in DLL -> Form wird nicht angezeigt

  Alt 20. Aug 2009, 17:38
@Apollonius:
Wenn ich die Handles übergebe, klappt es hervorragend. Ohne Pointer ist es natürlich noch etwas einfacher. Vielen Dank!
@Bernhard Geyer:
Bisher habe ich noch keine Probleme festgestellt. Könnten die entstehen, wenn das Programm auf einem nicht-Delphi-PC installiert wird?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Interface in DLL -> Form wird nicht angezeigt

  Alt 20. Aug 2009, 17:40
Solange du keine Runtimepackages verwendest, laufen deine Programme unabhängig von installiertem Delphi.

Pass auf mit deiner Methode GetForm. Interfaces kannst du ohne Probleme über Modulgrenzen hinweg verwenden; Objekte sind in dieser Hinsicht kompliziert, weil die Operatoren is und as nicht mehr funktionieren. Du solltest darüber nachdenken, auch dort ein HWnd zu verwenden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von bjd
bjd

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

Re: Interface in DLL -> Form wird nicht angezeigt

  Alt 20. Aug 2009, 17:47
Ich weiß, GetForm hatte ich auch bloß testweise drin um die Anzeigeprobleme vllt. (erfolglos) in den Griff zu bekommen. Die Funktion werde ich wahrscheinlich ganz rausnehmen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz