Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie Panel in dll ablegen und bei bedarf laden (https://www.delphipraxis.net/36112-wie-panel-dll-ablegen-und-bei-bedarf-laden.html)

St.Gro 30. Dez 2004 10:42

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Zitat:

Beim beenden des Programm trit ein Runtime-Error auf.
Ich hatte gedacht, es reicht, das Panel freizugeben, das reicht aber scheinbar nicht.
Du musst noch eine unload Prozedur mit ins Package übernehmen:

Code:
procedure UnloadMe;
begin
  fmTest.free
end;
und diese im FormClose Event aufrufen, dann kommen auch keine Fehler mehr beim Programmende:

Code:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  UnloadProc: procedure;
begin
  @UnloadProc:=GetProcAddress(phm, 'UnloadMe');
    if Assigned(UnloadProc) then
      UnloadProc;
Alternativ würde es sich anbieten, einen Verweis auf das Formular im Package der Hauptanwendung zu übergeben (Das geht mit Packages im Gegensatz zu DLLs), dann kannst du ja auch so free aufrufen.

Zitat:

wenn ich UnloadPackage in z.B. OnClose ereigniss einsetze so muss ich ja die Variable phm: hModule global machen d.h. ich kann nur ein Plugin laden. (Es sollen mehrere Plugins geladen werden können)
Nun, du denkst aber schon noch selber mit? z.B. die Idee von MrKnogge würde sich mir da auch als erstes aufdrängen.

Mit der Taskleiste, das kann ich nicht reproduzieren. Bei mir erscheint weder in der Taskleiste noch in der Prozessübersicht ein Eintrag vom geladenen Modul (Wie es auch sein sollte).
Schick mir doch mal bitte deinen Code.

jonny 30. Dez 2004 11:57

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja das mit einem Dynamischen Array hatte ich mir auch schon überlegt, ich dachte nur das es vielleicht eine bessere möglichkeit geben könnte.

Den Quellcode füge ich hier als anhang an.

Danke für eure Hilfe.

jonny 30. Dez 2004 21:03

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Und noch ne Frage wie kann ich dann aus dem Plugin heraus eine Procedure/Function aufrufen die in der Hauptanwendung deklariert ist? Geht das überhaupt?

jonny 3. Jan 2005 21:32

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Keiner Ne Idee????

jonny 4. Jan 2005 22:15

Re: Wie Panel in dll ablegen und bei bedarf laden
 
So habe jetzt ein Dyn. Array für die Hadles für die Plugins eingebaut und schon bekomme ich kurz nach dem das Plugin geladen wird und ich die hauptanwendung anklicke eine Zugrifsverletzung?

hier Mein Quellcode:
Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus, ElImgFrm;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    popupmenuClose: TMenuItem;
    N1: TMenuItem;
    popupmenuLoadPlugin: TMenuItem;
    opendlgPlugin: TOpenDialog;
    ElImageForm1: TElImageForm;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure popupmenuCloseClick(Sender: TObject);
    procedure popupmenuLoadPluginClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure LoadPlugin(PluginPath: String);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type TPluginModule = Record
  Name: String;
  pih: HModule;
end;

var
  Form1: TForm1;
  Plugins: Array of TPluginModule;
implementation

{$R *.dfm}

procedure TForm1.LoadPlugin(PluginPath: String);
var phm: HModule;
    LoadP: procedure (Handle: hwnd; var fHeight: integer);
    NewScrollBox: TScrollBox;
    fHeight: integer;
begin
  phm:=LoadPackage(PluginPath);
  If phm <> 0 Then
  try
    @LoadP:=GetProcAddress(phm, 'LoadMe');
    If Assigned(LoadP) Then
    begin
      NewScrollBox:=TScrollBox.Create(Form1);
      NewScrollBox.parent:=self;
      NewScrollBox.Align:=alTop;
      NewScrollBox.Height:=100;
      LoadP(NewScrollBox.Handle, fHeight);
      NewScrollBox.Height := fHeight;

      SetLength(Plugins, Length(Plugins) + 1);
      Plugins[Length(Plugins)].Name:='';
      Plugins[Length(Plugins)].pih:=phm;
    end
    else
    begin
      ShowMessage ('"LoadMe"-Prozedur nicht gefunden');
    end
  finally
//    UnloadPackage(phm);
  end
  else
    ShowMessage ('Plugin nicht gefunden');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  UnloadProc: procedure;
  I: Integer;
begin
  If Length(Plugins) > 0 Then
  begin
    For I:=0 To Length(Plugins) Do
    begin
      If Plugins[I].pih <> 0 Then
      begin
        @UnloadProc:=GetProcAddress(Plugins[I].pih, 'GetMeFree');
        If Assigned(UnloadProc) Then
          UnloadProc;
        end;
    end;
  end;
end;

procedure TForm1.popupmenuCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.popupmenuLoadPluginClick(Sender: TObject);
begin
  If opendlgPlugin.Execute Then
  begin
    LoadPlugin(opendlgPlugin.FileName);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(Plugins, 0);
end;

end.
Hat jemand ne Idee woran das liegen könnte?

jonny 7. Jan 2005 06:09

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Hat denn keiner ne Idee?

Bitte helft mir!

Boombuler 7. Jan 2005 07:12

Re: Wie Panel in dll ablegen und bei bedarf laden
 
was sagt denn dein Debugger dazu?


Greetz
Boombuler

(Ich hab das ganze mal mit ner DLL probiert ich bekomm immer beim CreateParented n fehler! -> Zugriffsverletzung)

jonny 7. Jan 2005 07:20

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Mein Debugger sagt garnichts das ist das Problem es kommt einfach ne MessegeBox wo steht Shutzverletzung blabla bla und ein Fenster in dem Assembler Befehle Stehen das wars.

Boombuler 7. Jan 2005 15:12

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Bei welchem Befehl denn? (das wird dein Debugger ja wohl sagen^^)

Greetz
Boombuler

jonny 9. Jan 2005 12:52

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Das ist es ja das es bei keinem Befehl ist. der Debuger zeigt nichts an, garnichts!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr.
Seite 3 von 4     123 4      

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