![]() |
Event aus BPL absetzen
Hallo,
wenn ich eine Procedure bzw. Function in einer BPL aufrufen möchte, dann geht das ja mit GetProcAddress Wie kann ich aber aus einer BPL raus ein Event absetzen? |
AW: Event aus BPL absetzen
*hochschieb*
|
AW: Event aus BPL absetzen
kann mir keiner weiterhelfen?
|
AW: Event aus BPL absetzen
Ich würde das genauso machen wie bei einer DLL: Mit einem Interface.
Sprich ich gebe der DLL oder BPL über eine Funktion das Interface und auf der anderen Seite werden dann alle registrierten Interfaces durchlaufen und eine darin enthaltene Ereignismethode aufgerufen. |
AW: Event aus BPL absetzen
Gibt's dafür ein Beispiel?
Hab mit Interfaces direkt noch keine Erfahrungen |
AW: Event aus BPL absetzen
In der Anwendung:
Delphi-Quellcode:
In der DLL:
type
IHostInterface = interface function GetOnShutdown: TList<IDLLClient>; end; IDllHostInterface = interface procedure Shutdown; end; THostInterface = class(TInterfacedObject, IHostInterface, IDllHostInterface) private FOnShutdown: IInterfacedList<IDLLClient>; function GetOnShutdown: IInterfacedList<IDLLClient>; public proedure Shutdown; // führt Shutdown in allen registrierten DLL-Clients aus property OnShutdown: IInterfacedList<IDLLClient> read GetOnShutdown; end;
Delphi-Quellcode:
Sprich du übergibst der DLL z.B. ein Interface, in dem ein Multicast-Event steckt. Wenn du nur eine DLL hast, reicht natürlich auch ein einfaches Interface statt der Liste. IInterfacedList ist eine Eigenimplementierung, die ich im Büro geschrieben habe, das gibt es bestimmt aber auch schon irgendwo (in Spring4D vielleicht?). Sonst kann man es ja schnell schreiben.
type
IDLLClient = interface procedure Shutdown; end; TDllClient = class(TInterfacedObject, IDllClient) public procedure Shutdown; end; procedure InitDll(const AHost: IHostInterface); var DllClient: TDllClient; begin DllClient := TDllClient.Create; AHost.OnShutdown.Add(DllClient); end; exports InitDll; Das Shutdown-Event hat auch direkt einen Sinn. Wenn man die DLL-Interfaces in Events im Hostinterface hat und die DLLs die Hostinterfaces, werden die Interfaces durch die Gegenseitige Referenz nie freigegeben. Deshalb führe ich vor dem Beenden des Programms den Shutdown-Befehl aus, durch den in der DLL die Events wieder herausgenommen werden. (Sauberer wäre die DLL Klasse im Programm in eine Eventklasse und eine Klasse mit den registrierten DLLs zu trennen... aber das wird hier als Beispiel zu umfangreich...) |
AW: Event aus BPL absetzen
sorry für meine späte Antwort - bin einfach nicht dazu gekommen...
Ich hab momentan das Problem, dass ich das nicht wirklich versteh. Vielleicht mal kurz erklärt was ich vor hab/brauch/will: Ich hab eine BPL, in der ich eine Klasse erzeuge (erzeugen in initialization, löschen in finalization) Darin wird eine Komponente erzeugt, die Events hat. Diese Events möchte ich durch meine Klasse an die Hostanwendung weiter geben. |
AW: Event aus BPL absetzen
Dann kannst du das ja genau so machen. Deine Hostanwendung übergibt ein Interface an die DLL und du hast in der DLL eine Klasse, die die Events empfängt und an dieses Interface weitergibt.
|
AW: Event aus BPL absetzen
muss ich mir von der Interface-Klasse eine Instanz erzeugen?
|
AW: Event aus BPL absetzen
Ja. Bei Interfaces gibt es keinen Mechanismus wie Klassenmethoden oder so etwas.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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