AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Form mehrfach aus DLL Laden

Ein Thema von Billi Berserker · begonnen am 26. Nov 2003 · letzter Beitrag vom 2. Dez 2003
Antwort Antwort
Billi Berserker
(Gast)

n/a Beiträge
 
#1

Form mehrfach aus DLL Laden

  Alt 26. Nov 2003, 18:05
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?
  Mit Zitat antworten Zitat
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Form mehrfach aus DLL Laden

  Alt 28. Nov 2003, 10:18
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?
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
Billi Berserker
(Gast)

n/a Beiträge
 
#3

Re: Form mehrfach aus DLL Laden

  Alt 28. Nov 2003, 18:43
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;
  Mit Zitat antworten Zitat
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Form mehrfach aus DLL Laden

  Alt 1. Dez 2003, 08:01
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.
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
Billi Berserker
(Gast)

n/a Beiträge
 
#5

Re: Form mehrfach aus DLL Laden

  Alt 1. Dez 2003, 10:39
Ich hab inzwischen eine andere Lösung gefunden. Über Delphi Packages läßt sich das Formular beliebig oft laden...
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Form mehrfach aus DLL Laden

  Alt 2. Dez 2003, 11:46
Ich will ja ned meckern, aber das hört sich sehr unsauber an
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 ...

LG, MyRealName
  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 03:01 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