Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Form mehrfach aus DLL Laden (https://www.delphipraxis.net/12408-form-mehrfach-aus-dll-laden.html)

Billi Berserker 26. Nov 2003 17:05


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:
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);
Nun habe ich aber folgende Probleme.
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?

Mario 28. Nov 2003 09:18

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?

Billi Berserker 28. Nov 2003 17:43

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:


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;
Die Hauptanwendung lädt dann dieses Formular und zeigt es auf seinem Formular an. Geladen wird das ganze in der Hauptanwendung :

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;

Mario 1. Dez 2003 07:01

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:
    if MainWnd = nil then
    begin
      MainWnd := TMainWnd.Create(nil);
      MainWnd.ParentWindow := handle;
      ...
      MainWnd.show;
    end
    else begin
      MainWnd.ParentWindow := handle;
      MainWnd.show;
    end;
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.

Das dieselbe DLL mehrfach geladen werden kann, bezweifle ich.

Billi Berserker 1. Dez 2003 09:39

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...

MyRealName 2. Dez 2003 10:46

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