![]() |
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:
Der Aufruf
item.OnClick := PluginMenuItemClick
item.tag := "irgendeine Nummer"
Delphi-Quellcode:
DllVonNummer((item as TMenuItem).tag).MenuItemClick
|
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. |
Re: TMenuItem soll eine DLL-Prozedur aufrufen
1. Es ist ein Record.
2. Was verstehst du unter "Übersetzer"? |
Re: TMenuItem soll eine DLL-Prozedur aufrufen
Eine Klasse welche die Funktionen der DLL als Objektmethoden bereitstellt
Delphi-Quellcode:
MenuItemClick ruft "nur" die Funktion der DLL auf, DoMenuItemClick wird in den Entsprechenden Menueintrag als Eventhandler eingehängt.
type
TMyClass = class(TObject) private procedure MenuItemClick(data : TItemData); public procedure DoMenuItemClick(Sender: TObject); end; |
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... |
Re: TMenuItem soll eine DLL-Prozedur aufrufen
Zitat:
Zitat:
Delphi-Quellcode:
oder zusätzlich noch eine Verwalter drüber legen der für jede DLL eine Instanz dieses Objektes erzeugt-
DllVonNummer((item as TMenuItem).tag).MenuItemClick
|
Re: TMenuItem soll eine DLL-Prozedur aufrufen
Zitat:
Zitat:
Müsste ich nocheinmal die Dll laden? Zitat:
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; |
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:
Delphi-Quellcode:
procedure TLinkDoMenuItemClick (...)
begin Vorbereitungs-Bla; MenuItemClick(...); Nachbereitungs-Bla; end; |
Re: TMenuItem soll eine DLL-Prozedur aufrufen
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
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 21:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz