Einzelnen Beitrag anzeigen

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