Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TMenuItem soll eine DLL-Prozedur aufrufen (https://www.delphipraxis.net/83371-tmenuitem-soll-eine-dll-prozedur-aufrufen.html)

xZise 1. Jan 2007 14:07


TMenuItem soll eine DLL-Prozedur aufrufen
 
Ich habe folgendes Problem:
Ich habe in einer DLL die Funktion "MenuItemClick(data : TItemData)"
Und diese Funktion so aufgerufen werden, wenn auf ein MenuItem geklickt wurde.

Zuerst habe ich gedacht, ich mach es direkt, aber dann meckert er rum, dass die Funktion kein Methodenzeiger ist.

Dann habe ich hier gesucht, und nur ergbnisse gefunden, wo man nicht selber Parameter übergeben kann.

Dann dachte ich:

Wie kann ich es also realisieren, dass die Methode einer speziellen DLL im Nachhinein aufgerufen wird.

Ich würde gerne sowas ungefähr haben:

Die Methodenzuweisung:
Delphi-Quellcode:
item.OnClick := PluginMenuItemClick
item.tag := "irgendeine Nummer"
Der Aufruf
Delphi-Quellcode:
DllVonNummer((item as TMenuItem).tag).MenuItemClick

Bernhard Geyer 1. Jan 2007 14:26

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
Direkt geht nicht. Du mußt mindestens ein "Übersetzer"-Objekt dazwischenschalten.

Und ich hoffe TItemData ist ein Record. Du weißt ja: Objektaustasch zwischen Exe und DLL ohne Laufzeitpackages ist nicht so ohne weiteres.

xZise 1. Jan 2007 15:32

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
1. Es ist ein Record.
2. Was verstehst du unter "Übersetzer"?

Bernhard Geyer 1. Jan 2007 15:37

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
Eine Klasse welche die Funktionen der DLL als Objektmethoden bereitstellt

Delphi-Quellcode:
type
  TMyClass = class(TObject)
  private
    procedure MenuItemClick(data : TItemData);
  public
    procedure DoMenuItemClick(Sender: TObject);
  end;
MenuItemClick ruft "nur" die Funktion der DLL auf, DoMenuItemClick wird in den Entsprechenden Menueintrag als Eventhandler eingehängt.

xZise 1. Jan 2007 16:14

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
Und DoMenuItemClick ruft MenuItemClick auf?

Dann habe ich das Problem, dass es mehere Einträge geben kann.

Und ich weiß nicht, welche "MenuItemClick" ich aufrufen muss. Die von Dll-X oder DLL-Y...

Bernhard Geyer 1. Jan 2007 17:32

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
Zitat:

Zitat von xZise
Und DoMenuItemClick ruft MenuItemClick auf?

So in der Art.


Zitat:

Zitat von xZise
Dann habe ich das Problem, dass es mehere Einträge geben kann.
Und ich weiß nicht, welche "MenuItemClick" ich aufrufen muss. Die von Dll-X oder DLL-Y...

Du kannst Doch deinen Code entsprechende erweitern.

Delphi-Quellcode:
DllVonNummer((item as TMenuItem).tag).MenuItemClick
oder zusätzlich noch eine Verwalter drüber legen der für jede DLL eine Instanz dieses Objektes erzeugt-

xZise 1. Jan 2007 17:49

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von xZise
Und DoMenuItemClick ruft MenuItemClick auf?

So in der Art.

o.O Wie soll ich das dann realisieren?

Zitat:

Zitat von Bernhard Geyer
Du kannst Doch deinen Code entsprechende erweitern.

Delphi-Quellcode:
DllVonNummer((item as TMenuItem).tag).MenuItemClick

Aber wie komme ich an die "DllVonNummer()"?
Müsste ich nocheinmal die Dll laden?

Zitat:

Zitat von Bernhard Geyer
oder zusätzlich noch eine Verwalter drüber legen der für jede DLL eine Instanz dieses Objektes erzeugt-

Also sozusagen ein "array of TMyClass"? Und für jede Dll dann ein Objekt erstellen? Dass könnte funktionieren.

Aber jetzt bräuchte ich irgendwie Quelltext, weil ich bisher irgendwie weiterkomme.

Also ich mache es ungefähr so:
Delphi-Quellcode:
type
  TLink = class(TObject)
  private
    procedure MenuItemClick(data : TItemData);
  public
    procedure OnMenuItemClick(Sender: TObject) of object;
  end;

[...]

procedure OnMenuItemClick(Sender : TObject);
begin
  { Mein Verständnisproblem: }
  "MenuItemClick der DLL aufrufen und 'data' übergeben"
end;

Delphi-Quellcode:
var
  Linker : array of TLink
begin
  [...] // DLL laden
  item.OnClick := Linker[High(Linker)].OnMenuItemClick;
end;

Bernhard Geyer 1. Jan 2007 17:57

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
Du lädst ja deine DLL's dynamisch.

- Jedes TLink-Instanz hat noch eine Handle auf die DLL welcher bei LoadLibrary herauskommt. Am besten erledigt jede Instanz die DLL-Ladeaktionen selbst.
- Für jede Funktion in der DLL definierst du eine Typ welche als Membervariable in der TLink-Klasse vorhanden ist (Beispiele für Typdefinitionen gibt es genügend im Forum)
- Zusatzdaten wie deine TItemData mußt du selbst in den Instanzen hinterlegen (Kenn jetzt dein komplettes Programm nicht um zu wissen wie das am geschicktesten machst.

Zitat:

Zitat von xZise
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von xZise
Und DoMenuItemClick ruft MenuItemClick auf?

So in der Art.

o.O Wie soll ich das dann realisieren?

Was verstehst du daran nicht?

Delphi-Quellcode:
procedure TLinkDoMenuItemClick (...)
begin
  Vorbereitungs-Bla;
  MenuItemClick(...);
  Nachbereitungs-Bla;
end;

xZise 1. Jan 2007 18:42

Re: TMenuItem soll eine DLL-Prozedur aufrufen
 
Zitat:

Zitat von Bernhard Geyer
Du lädst ja deine DLL's dynamisch.

Jap.

Zitat:

Zitat von Bernhard Geyer
- Jedes TLink-Instanz hat noch eine Handle auf die DLL welcher bei LoadLibrary herauskommt. Am besten erledigt jede Instanz die DLL-Ladeaktionen selbst.

Also z.B. im Konstructor "LodLibraray" und im Destructur "FreeLibrary" oder?
Zitat:

Zitat von Bernhard Geyer
- Für jede Funktion in der DLL definierst du eine Typ welche als Membervariable in der TLink-Klasse vorhanden ist (Beispiele für Typdefinitionen gibt es genügend im Forum)

Du meinst die Funktionen, die von den Komponenten ausgelöst werden?
Zitat:

Zitat von Bernhard Geyer
- Zusatzdaten wie deine TItemData mußt du selbst in den Instanzen hinterlegen (Kenn jetzt dein komplettes Programm nicht um zu wissen wie das am geschicktesten machst.

Da wird sich ein weg finden lassen ;)

Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von xZise
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von xZise
Und DoMenuItemClick ruft MenuItemClick auf?

So in der Art.

o.O Wie soll ich das dann realisieren?

Was verstehst du daran nicht?

Das "So in der Art." ;)

Also soweit ersichtlich. Nur die Klasse ist nicht im DLL-Code (oder?).
Und das mit dem Laden und Handle ist alles logisch, nur habe ich das Problem (ich konnte noch nicht coden), dass er ja das "MenuItemClick" eines speziellen Handles ausführen soll.

Vielleicht denk ich auch einfach nur zu kompliziert :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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