![]() |
Form mehrfach aus DLL Laden
Hier mein Problem :
Ich habe eine dll Datei in der befindet sich ein normales TForm mit diversen Schaltflächen. Nun importiere ich dieses Formular aus der dll Datei in mein Hauptprogramm. Dabei lege weise ich dem Formular ein TPanel als Parent zu um das ganze besser unter Kontrolle zu haben. Das funktioniert so weit auch ohne Probleme. Hier ein kleiner Code Ausschnitt(nur falls dort schon Fehler stecken)
Delphi-Quellcode:
Nun habe ich aber folgende Probleme.
var
MainWnd : hwnd; ... dlldata.dllhandle := LoadLibrary(pchar(ExtractFileDir(Application.ExeName)+'\Objects\'+ObjectFile)); if dlldata.dllhandle <>0 then begin @dlldata.StartMainWnd := GetProcAddress(dlldata.dllhandle,'StartMainWnd'); @dlldata.StartMainWndEx := GetProcAddress(dlldata.dllhandle,'StartMainWndEx'); end; MainWnd:=dlldata.StartMainWndEx(BackgroundPanel.Handle); 1. Ich möchte das das Formular der dll Datei Transparent angezeigt wird. Es sollen also nur die Schaltflächen sichtbar sein. Der Rest soll so Transparent sein das der Hintergrund des HauptFormulars der Anwendung angezeigt wird. Das Problem ist das sämtliche gesetzte Eigenschaften wie AlphaBlend,Trasparenz oder Canvas.Brush.Style:=bsnone nach dem importieren in die Hauptanwendung keine Wirkung zeigen. 2. Das Zweite problem ist das das erste importierte Fenster sofort verschwindet wenn ich den Code nochmals mit der selben dll Datei ausführe. Es ist jedoch verdammt wichtig das es irgendwie funktioniert das ich zwei mal die selbe dll lade und die Formulare unabhängig voneinander importieren kann. Nur wie mache ich das? |
Re: Form mehrfach aus DLL Laden
Zeige doch mal ein wenig Code von StartMainWndEx der DLL. Und dann binde bitte in DLL und exe mal das Package VCL ein und erzeuge beide neu. Verschwindet dann einer der Effekte?
|
Re: Form mehrfach aus DLL Laden
Es geht mir vorerst nur um das mehrfache laden der dll so das ich den Code der DLL sowie das Formular aus der dll mehrfach und unabhängig voneinander nutzen kann...
Die exporitere funktion der DLL
Delphi-Quellcode:
Die Hauptanwendung lädt dann dieses Formular und zeigt es auf seinem Formular an. Geladen wird das ganze in der Hauptanwendung :function StartMainWndEx(handle : Hwnd): hwnd; begin try if MainWnd = nil then begin MainWnd := TMainWnd.Create(nil); MainWnd.ParentWindow := handle; ... MainWnd.show; end else begin MainWnd.ParentWindow := handle; MainWnd.show; end; result := MainWnd.Handle; except result := 0; end; end;
Delphi-Quellcode:
type
Tdllhandle = record dllhandle : THandle; StartMainWndEx : function(owner : Hwnd): hwnd; StartMainWnd : function :hwnd ; ... end; TDesktopObject = object dlldata : Tdllhandle; ObjectFile : String; ID : integer; PosX,PosY : integer; Width,Height : integer; BackgroundPanel : TPanel; MainWnd : hwnd; procedure LoadObject; end; var DesktopObjects : array of TDesktopObject; procedure TDesktopObject.LoadObject(); begin if dlldata.dllhandle<>0 then begin BackgroundPanel.Free; freelibrary(dlldata.dllhandle); end; dlldata.StartMainWndEx:=nil; dlldata.StartMainWnd:=nil; dlldata.dllhandle:=0; BackgroundPanel := TPanel.Create(MainForm); ... try dlldata.dllhandle := LoadLibrary(pchar(ExtractFileDir(Application.ExeName)+'\Objects\'+ObjectFile)); if dlldata.dllhandle <>0 then begin @dlldata.StartMainWnd := GetProcAddress(dlldata.dllhandle,'StartMainWnd'); @dlldata.StartMainWndEx := GetProcAddress(dlldata.dllhandle,'StartMainWndEx'); end; MainWnd:=dlldata.StartMainWndEx(BackgroundPanel.Handle); BackgroundPanel.Show; except end; end; |
Re: Form mehrfach aus DLL Laden
Dein Problem ist doch, dass Du das Form nur einmal erzeugen kannst? Das liegt ja hier dran:
Delphi-Quellcode:
Du solltest, sofern Du das Formular mehrfach haben möchtest, einfach diese Funktion abändern. Die erzeugten Formulare könntest Du mit einer TList oder so verwalten, um sie wieder sauber frei zugeben.
if MainWnd = nil then
begin MainWnd := TMainWnd.Create(nil); MainWnd.ParentWindow := handle; ... MainWnd.show; end else begin MainWnd.ParentWindow := handle; MainWnd.show; end; Das dieselbe DLL mehrfach geladen werden kann, bezweifle ich. |
Re: Form mehrfach aus DLL Laden
Ich hab inzwischen eine andere Lösung gefunden. Über Delphi Packages läßt sich das Formular beliebig oft laden...
|
Re: Form mehrfach aus DLL Laden
Ich will ja ned meckern, aber das hört sich sehr unsauber an :shock:
Mein Vorredner hat Recht, wenn Du mehrere Formulare über dieselbe Funktion holst, mußt Du sie getrennt verwalten (Objekt-Instanzen bilden !) und diese auch einzeln wieder freigeben ! Was Du das machst, machen sonst ja nur 20-jährige Japaner :gruebel: ... LG, MyRealName |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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