![]() |
Interface in DLL -> Form wird nicht angezeigt
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 ![]() Das ist mein Interface:
Delphi-Quellcode:
So steht es in der DLL:
PSuSecBGInt = ^ISuSecBGInt;
ISuSecBGInt = interface ['{62A88606-F5DC-4F25-A5B9-6C5E851A9CE9}'] Procedure SetParent(Const AParent: TWinControl); Procedure TryClose; Function GetForm: TForm; end;
Delphi-Quellcode:
Der Aufruf ist ganz simpel. Im Hauptprogramm wurde die DLL-Funktion "GetPMI" eingebunden:
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.
Delphi-Quellcode:
Anschließend:
Function GetPMI1: PSuSecBGInt; External 'mod1.dll' Name 'PMI';
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; |
Re: Interface in DLL -> Form wird nicht angezeigt
Delphi Objekte im Interface einer Dll ist immer eine schlechte Idee
|
Re: Interface in DLL -> Form wird nicht angezeigt
Du wirst gemeinsame Runtimepackages benötigen um einen einheitlichen Speichermanager und eine gemeinsame automatische Referenzzählung zu haben.
|
Re: Interface in DLL -> Form wird nicht angezeigt
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. |
Re: Interface in DLL -> Form wird nicht angezeigt
@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? |
Re: Interface in DLL -> Form wird nicht angezeigt
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. |
Re: Interface in DLL -> Form wird nicht angezeigt
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz