AGB  ·  Datenschutz  ·  Impressum  







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

Eine DLL freigeben. (CallBack)

Ein Thema von geskill · begonnen am 29. Jan 2008 · letzter Beitrag vom 30. Jan 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#11

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 11:21
Ich habe das doch so gemacht wie du meinst.
Die Variable auf NIL im Destroy ist doch okay.
Wenn ich dich richtig verstanden habe darf ich das nicht im Destroy freigeben oder?
Ja wann dann?
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 11:25
Zitat von geskill:
Ich habe das doch so gemacht wie du meinst.
Die Variable auf NIL im Destroy ist doch okay.
Wenn ich dich richtig verstanden habe darf ich das nicht im Destroy freigeben oder?
Ja wann dann?
Der Teil mit der Freigabe Formular passt, aber du darfst die DLL nicht im Callback freigeben. Verwende wie schon angemerkt einen Event den du der Exe per PostMessage mitteilst.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#13

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 11:27
argghhh...
dann hat Muetze1 mich auf den falschen Pfad gelockt... :-(((
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#14

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 11:29
Zitat von geskill:
argghhh...
dann hat Muetze1 mich auf den falschen Pfad gelockt... ((
Häst doch nur seine Vorschläge von oben abarbeiten müssen
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 11:35
Zitat von geskill:
argghhh...
dann hat Muetze1 mich auf den falschen Pfad gelockt... ((
Wieso? Du kannst über den Callback sehr gut der Anwendung Bescheid geben, dass sie die DLL entladen kann. Ich habe nichts gesagt, dass die Hauptanwendung dies direkt im Callback machen soll. Sie kann sich aus dem Callback die DLL zum freigeben vermerken, etc. Die Hauptanwendung kann zum entkoppelt in dem DLL Callback sich selber per PostMessage entsprechend einen Auftrag senden, etc. Es gibt so viele Möglichkeiten und der Callback ist nun nicht eine ungehbare Version.

Und ich habe zuvor schon eine gewisse Sortierung in Richtung des Umfangs/Schwierigkeit gegeben, da hat Bernhard Geyer schon Recht.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 15:23
Ihr schreibt so als wäre ich jetzt richtig böse, mal lernt halt dazu, jetzt kann ich CallBack wieder hervorkrammen wenn ichs brauche...

Zitat von Muetze1:
Und ich habe zuvor schon eine gewisse Sortierung in Richtung des Umfangs/Schwierigkeit gegeben, da hat Bernhard Geyer schon Recht.
Ich habe zum Thema CallBack am meisten gefunden, naja dann werde ich mir jetzt mit "Windows Message an das Hauptprogramm" senden beschäftigen... Hätte nichts gegen links wo dies erklärt wird, hier im Forum und Google spucken nicht so viel aus :(
Sebastian
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 15:43
Hallo,

in der hilfe nach PostMessage suchen. Am besten du definierst dir einen eigene Nachricht
Delphi-Quellcode:
const
  wm_FreeMyLibrary = wm_User + 100;
Abschicken mit
  PostMassage(Mainform.Handle, wm_FreeMyLibrary, 0, 0); Empfangen in der eigenen Procedure
Delphi-Quellcode:
  procedure WMFreeMyLibrary(var Message: TMsg); message WM_FreeMyLibrary;


procedure TMainForm.WMFreeMyLibrary(var Message: TMsg);
begin
  // DLL frei geben
end;
Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 16:25
Wie ich in den Debugger schaue und auf diesen Satz hoffe: "Modul entladen: ...". Und er kommt, erstmal danke an alle und besonders an oki aber, auch die anderen haben wieder super geholfen. So und an alle die gleiches Vorhaben werde ich hier mal meinen Code präsentieren:

MainForm
Delphi-Quellcode:
type
  TMainForm = class(TForm)
    bDllLaden: TButton;
    bClose: TButton;
    procedure bCloseClick(Sender: TObject);
    procedure bDllLadenClick(Sender: TObject);
  private
    // die Variable muss global gespeichert werden damit FreeLibrary ein Ziel hat
    class var hLib:cardinal;
    const
      wm_FreeMyLibrary = wm_User + 100;
  public
    procedure WMFreeMyLibrary(var Message: TMsg); message WM_FreeMyLibrary;
  end;

  // Die dynamische dekleration einer dll
  TYPE Tcreatedll = PROCEDURE (FormHandle:HWND);

//[...]
procedure TMainForm.bDllLadenClick(Sender: TObject);
VAR Mcreatedll : Tcreatedll;
BEGIN
  hLib := LoadLibrary(PChar('pDLL.dll'));
  IF hLib <> 0 THEN BEGIN
  @Mcreatedll := GetProcAddress(hLib, 'createDll');
  IF @Mcreatedll <> NIL
   // nun wird zusätzlich das handle übergeben, was später benötigt wird
   THEN Mcreatedll(MainForm.Handle);
  END;
end;

procedure TMainForm.WMFreeMyLibrary(var Message: TMsg);
begin
  // hier kann auch alles mögliche stehen, aber dass kann man dann auch in einem callback schreiben
  freelibrary(hLib);
end;
In der DLL.dpr habe ich nichts verändert nur die export Procedure...

DLL Formular
Delphi-Quellcode:
type
  TDllAddons = class(TForm)
    bClose: TButton;
    procedure bCloseClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
    const
      wm_FreeMyLibrary = wm_User + 100;
  public
    { Public-Deklarationen }
  end;

//[...]

  AFormHandle:HWND;

  PROCEDURE createDll(FormHandle:HWND);

//[...]

PROCEDURE createDll(FormHandle:HWND);
BEGIN
  IF NOT (Assigned(DllAddons))
    THEN DllAddons := TDllAddons.Create(NIL);

  // parameterübergabe
  AFormHandle := FormHandle;

  DllAddons.Show;
END;

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

procedure TDllAddons.FormDestroy(Sender: TObject);
begin
  // den parameter schön freigeben
  DllAddons := NIL;
  // die nachicht senden
  PostMessage(AFormHandle, wm_FreeMyLibrary, 0, 0);
end;
Und nochmal als Download, damit es auch jeder ausprobieren kann; man bin ich glücklich :dancer: :-D :drunken: :firejump:
Angehängte Dateien
Dateityp: zip postmessage_102.zip (437,9 KB, 2x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#19

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 16:52
hi,

schön, dass es klappt. Mein Codeschnipsel hat aber nur den Rest gebracht. Den Weg haben die anderen gewiesen.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#20

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 16:57
vielleicht noch ein wichtiger Hinweis, das mit dem PostMessage muss in der Hauptunit stehen, von welcher das Handle stammt....
Sebastian
  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:45 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