AGB  ·  Datenschutz  ·  Impressum  







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

Dll Forms... oder ligt es nicht daran ??

Ein Thema von dor557 · begonnen am 18. Aug 2007 · letzter Beitrag vom 30. Aug 2007
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#11

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:09
Sascha, schnapp mal eine Runde frische Luft, dann sieht Du das Problem auch

Du greifst auf die DLL zu, rufst die Procedure auf und gibst danach die DLL wieder frei, welche auch die Form in der DLL zerstört. Auf was sollte bitte gewartet werden?

Du musst auf die DLL zugreifen und erst später (Programmende?) wieder per FreeLibrary schließen.

[edit]Ich würde Dir noch vorschlagen, eine Klasse zu schreiben, die erstmal alle dlls im Plugin-Ordner in eine Liste einfügt. Sobald dann ein Plugin benötigt wird, lädt die Klasse die DLL in den Speicher. Bevor nun die DLL-Form geschlossen wird, sendet diese eine Nachricht an das Hauptprogramm, darauf hin schließt sich die Form und die Klasse gibt per FreeLibrary die DLL frei. Soweit der theoretische Ansatz. Jetzt ist Dein Grips gefragt. [/edit]
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 24. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#12

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:20
Wie soll ich denn eine Nachricht an die Dll schicken ?? oder von der DLL in das Hauptprogramm.

Etwa mit Messages ?? wenn ja das habe ich noch nie gemacht und kenne mich damit nicht aus.

Aber wenn jemand einen Rat hat oder eine Tutorial dann würde das Helfen..

Ich versuch mal die DLL zu öffnen ohne das Befreien vom speicher !

Gruss Sascha
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#13

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:25
Zitat von dor557:
Ich versuch mal die DLL zu öffnen ohne das Befreien vom speicher !
Einfach das FreeLibrary nicht gleich hinterher aufrufen, sondern "wo anderst" = Programmende oder beim Drücken auf einen zweiten Knopf.

Zur Kommunikation DLL <-> Hauptprogramm empfehle ich Dir diesen und die nachfolgenden Posts:
Klick mich
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 24. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#14

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:30
Habe Jetzt die Zeile :

KundendatenF.Release; Procedure gelöscht.

die Handle Variable als Global variable gesetzt und einen 2. Button auf das Hauptformular gesetzt.

Es ist richtig das ich automatisch den speicher wieder frei gebe.

Nun gebe ich den Speicher bei Klick auf den 2. Button wieder frei. und das Formular Funktioniert.

Aber wie kann ich das vermeiden das ich extra einen Button anklicken muss.

Habe schon oft von msg gehört. Kann ich an die DLL eine Message schicken bzw. von der DLL an das HauptProgramm ??
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#15

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:34
Hi Sascha,

ich würde, wie gesagt, erst mal eine Klasse "drumrum" bauen, die die DLLs aufruft. Ich denke, dass Du ja nicht nur ein PlugIn haben wirst. Lieber jetzt ein bisschen mehr Zeit (und Nerven) investieren, aber dafür hast Du dann hinterher einen sauberen, erweiterbaren Aufbau einer PlugIn-Klasse. Aber das ist Dir überlassen (ich kenne ja Dein Projekt nicht).

Zum Message verschicken, schau Dir mal Hier im Forum suchenSendMessage bzw. Hier im Forum suchenPostMessage. Beachte allerdings, dass Du ein Handle brauchst, an dass die Nachricht geschickt wird. Das heißt, dass Du der DLL das Handle des Hauptprogramm mitliefern musst.
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 24. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#16

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:37
Muhkuh : Du hast recht. Aber auch das ist neuland für mich. Begebe mich da in ein Komplettes Neuland für mich.

Habe biser immer nur formulare gemacht und das als Exe Fertig. da habe ich weder Messages gebraucht noch Klassen erstellen müssen.

Ist der Link den du mir da genannt hast eine Anleitung für die Klassen ?? oder ist das etwas anderes ?
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#17

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:43
Hi Sascha,

der Link (im vorherigen Post), ist eine Anleitung für ein Interface, dass die Kommunikation Hauptprogramm <-> DLL abdeckt.

Klassen an sich, sind nichts "schweres". Hier hab ich noch ein Link für Dich, der Dir das ganze ein bisschen näher bringt.
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#18

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 17:47
Ich hab da auch noch nen guten Link zu Ollis HP.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 24. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#19

Ergebnis bis jetzt !

  Alt 25. Aug 2007, 19:55
Also habe nun Lektüre gelesen und gemacht und getan und habe folgendes zusammen bekommen.

Hauptprogramm bestehend aus folgenden dateien :
MainF.pas
Interfaces.pas
filefinder.pas (werde ich aber mal nicht mit hinzufügen. denke sieht jeder selbst was der machen soll)

interfaces.pas :
Delphi-Quellcode:
unit interfaces;

interface
 uses classes, forms;
const
  IID_Plugin: TGUID = '{664AAC6B-BF3B-4539-8682-1C33AC692D62}';
  IID_PluginForm: TGUID = '{70B82481-A4E5-4E3F-BAF3-1697EA771FAD}';
  IID_App: TGUID = '{AC519934-9997-432C-9055-E80FD001F502}';

type
  IPlugin = Interface(IInterface)
    ['{664AAC6B-BF3B-4539-8682-1C33AC692D62}']
    function GetName: PChar; stdcall;
    function GetVersion: Integer; stdcall;
  End;

  IPluginForm = Interface(IInterface)
    ['{70B82481-A4E5-4E3F-BAF3-1697EA771FAD}']
  End;


implementation

end.
MainF.pas
Delphi-Quellcode:
unit MainF;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus, ActnList, interfaces, filefinder, inifiles;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Programm1: TMenuItem;
    Beenden1: TMenuItem;
    Plugin1: TMenuItem;
    ActionList1: TActionList;
    Action1: TAction;
    Memo1: TMemo;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Action1Execute(Sender: TObject);
  private
// app: IApp;
    hDLL : HWND;
    iPlg: IPlugin;
    iPlgForm : IPluginForm;
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  AktDll : Integer;
  ProgDir : String;
  LibDir : String;
implementation

{$R *.DFM}

procedure TForm1.Action1Execute(Sender: TObject);
type
  TProcInitPlg = function(PApp: TApplication; PForm: TForm): IPluginForm; stdcall;
var fProc: TProcInitPlg;
begin
  @fProc := GetProcAddress(hDLL, 'RunPlugin');
  if fProc(Application,Form1) <> nil then
  begin
    iPlgForm := fProc(Application,Form1);
  end;
end;

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

procedure TForm1.FormCreate(Sender: TObject);
type
  TProcInitPlg = function: IPlugin; stdcall;
var
  fProc: TProcInitPlg;
  New_Entry_Plugin : TMenuItem;
begin
  ProgDir := extractfilepath(paramstr(0));
  LibDir := copy(ProgDir,0,Pos('bin',ProgDir)-1) + 'lib\';
  messageDlg('folgender Pfad wird durchsucht : ' + LibDir, mtInformation, [mbOK],0);
  Memo1.Lines := FindPlugins(LibDir);
  // Bibliothek laden und Interface holen
  messageDlg('Versuche folgende DLL zu laden : ' + LibDir + Memo1.Lines[0], mtInformation, [mbOK],0);
  hDll := LoadLibrary(PCHAR(libdir + Memo1.Lines[0]));
  @fProc := GetProcAddress(hDLL, 'InitPlugin');
  if fProc <> nil then
  begin
    iPlg := fProc;
    New_Entry_plugin := TMenuItem.Create(self);
    Action1.Caption := PCHAR(iPlg.GetName);
    New_Entry_Plugin.Action := Action1;
    Plugin1.Add(New_Entry_Plugin);
  end;


end;

procedure TForm1.FormDestroy(Sender: TObject);
var i : Integer;
begin
 // PlugIn zerstören
  iplg := nil;
  iPlgForm := nil;
 // Bibliothek entladen
  FreeLibrary(hDLL);
 // Application-Interface zerstören
// app := nil;
end;

end.
nun die dll :
kMain.pas
interfaces.pas
kundendaten.dpr / projektdatei

so nun erstmal die dpr
Delphi-Quellcode:
library Kundendaten;


uses
  SysUtils,
  Classes,
  forms,
  kMain in 'kMain.pas{KundendatenF},
  interfaces in '..\..\units\interfaces.pas';

{$E dll}

{$R *.res}

function InitPlugin: IPlugin; stdcall;
begin
  Result := TPlugin.Create;
end;

Function RunPlugin(pApp: TApplication; PForm: TForm) : IPluginForm; Stdcall;
var tmpForm : TPluginForm;
begin
  tmpForm := TPluginForm.create(pApp,PForm);
  Result := tmpForm;
end;

exports
  InitPlugin,
  RunPlugin;
begin
end.

die kMain.pas
Delphi-Quellcode:
unit kMain;

interface

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

type
  TKundendatenF = class(TForm)
    Button2: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TPluginForm = Class(TInterfacedObject, IPluginForm)
  private
    ClientForm : TKundendatenF;
  protected
  public
     constructor create(PApp: TApplication; PForm: TForm);
     destructor Destroy; override;
  End;

  TPlugin = class(TInterfacedObject, IPlugin)
  private
    function GetName: PChar; stdcall;
    function GetVersion: Integer; stdcall;
  protected
    // hier die Methoden von system.TInterfacedObject reinkopieren
  public

  end;

var
  KundendatenF: TKundendatenF;
  dllApp: TApplication;
  PluginForm : TPluginForm;

implementation

constructor TPluginForm.create(PApp: TApplication; PForm: TForm);
begin
  dllApp := Application;
  Application := PApp;
  ClientForm := TKundendatenF.Create(Application);
end;


destructor TPluginForm.Destroy;
begin
  ClientForm.free;
end;

{ TPlugin }
function TPlugin.GetName: PChar;
begin
  Result := '&Kundendaten'; // "T" unterstrichen im Menü
end;

function TPlugin.GetVersion: Integer;
begin
  Result := (1 shl 16) or 0; // 1.0
end;

{$R *.dfm}

procedure TKundendatenF.Button2Click(Sender: TObject);
begin
  close;
end;

procedure TKundendatenF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.
So Funktioniert auch so weit. Ich kann das Programm starten und das MDIChild öffnen. Alles super. Es wird auch korrekt geschlossen. Aber sobald ich das Programm Beenden möchte Gibt er mir eine Fehlermeldung raus.

Ich habe schon versucht mit verschiedenen mitteln denn ich denke das der grund hier ligt :

Delphi-Quellcode:
  dllApp := Application; <<----- Geschätzte uhrsache !!
  Application := PApp;
  ClientForm := TKundendatenF.Create(Application);
habe auch schon versucht das wieder an das Programm zurückzugeben aber ohne erfolg Macht keinen unterschied ! hat jemand einen Rat ?

Gruss Sascha
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#20

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 25. Aug 2007, 21:37
Delphi-Quellcode:
constructor TPluginForm.create(PApp: TApplication; PForm: TForm);
begin
  ClientForm := TKundendatenF.Create(PApp);
end;
So sollte es funktionieren. Die Variable Application wird von Delphi bereits benutzt, die sollte man nicht vermurksen
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 18:29 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