![]() |
Event aus DLL für HotSpot Nutzen
Mahlzeit ich bin neu hier und auch neu bei Delphi
Ich habe folgendes vor und zwar will ich ein Callback für meinen HotSpot einrichten Bzw ich habe eine Event Procedure in einer DLL dieses Event soll reagieren wenn ich meinen hotSPot auf meinem Gerät drücke! Quasi also wie ein button allerdings krieg ich es nicht hin das Event auf den button zu Legen! Dies soll wohlbemerkt alles in einer klasse Verwirklicht werden Irgendwelche Tipps ? MfG Johnny |
AW: Event aus DLL für HotSpot Nutzen
Was meinst Du mit HotSpot?
|
AW: Event aus DLL für HotSpot Nutzen
schlichtweg ein Button auf meinem Gerät der hotSpot genannt wird
|
AW: Event aus DLL für HotSpot Nutzen
Zitat:
Ein Event handler in Delphi muss eine Methode eines Objektes sein, oft ein TNotifyevent, also vom Typ
Delphi-Quellcode:
Das "of Object" impliziert, das es sich um eine Methode eines Objektes handeln muss. Das Äquivalent einer standalone procedure mit der gleichen Signatur wäre
procedure (sender: TObject) of Object;
Delphi-Quellcode:
self ist dabei die Addresse des Objektes, zu dem die Methode gehört, oder der Klasse selbst, bei einer class procedure.
procedure (self: TObject; sender: TObject); // register calling convention!
Eine Methode kann man nicht direkt aus einer DLL exportieren, eine Prozedur mit der äquivalenten Signatur aber schon. Um die als Event handler verwenden zu können bedarf es aber eines Tricks. Es gibt einen Typ in Delphi, der eine Methode repräsentiert: ![]() Damit kann man einen Tnotifyevent quasi on the fly erzeugen:
Delphi-Quellcode:
var
M: TMethod; begin M.data := nil; M.code := GetProcaddress(dllhandle, NameDerExportiertenProzedur); hotspotbutton.OnClick := TNotifyEvent(M); Der hier verwendete Wert für M.Data wird als Self-Parameter an die Prozedur übergeben. Die Prozedur in der DLL kann den Aufruf dann an eine Methode eines internen Objektes weiterleiten. |
AW: Event aus DLL für HotSpot Nutzen
Also bisher habe ich Folgendes versucht
Code:
Allerdings funktioniert das so nicht ganz
unit PadKlasse;
interface uses Winapi.Windows, Classes; Type TSTSensorHotSpotPressed = Procedure(nHotSpotID:integer)Of Object; TStPad = class constructor create; destructor destroy; private FOnSensorHotSpotPressed:TSTSensorHotSpotPressed; Procedure SensorHotSpotPressed(nHotSpotID : Integer); procedure STSensorHotSpotPressed_stdcall(nHotSpotId: Smallint);register; // Das ist das Event das ich von der DLL kriege external 'STPadLib.dll'; Procedure TStPad.SensorHotSpotPressed(nHotSpotID : Integer); begin // end; hoffe das is das was du brauchst ! |
AW: Event aus DLL für HotSpot Nutzen
Zitat:
Ich versteh auch das Design nicht, was vermutlich teilweise an deiner irreführenden Verwendung von "event" liegt :wink:. Eine DLL exportiert keine Events, sie exportiert Funktionen oder Prozeduren, die von der Anwendung aufgerufen werden sollen, d.h. die Aktion beginnt in der Anwendung (Benutzer drückt button), wird von der Anwendung erkannt (OnClick event des buttons) und die ruft dann eventuell eine von der DLL exportierte Funktion/Prozedur auf, damit die DLL noch irgendwas macht. Danach kehrt der Programmfluss wieder in die Anwendung zurück. Diese Verwendung von DLLs ist der häufigste Fall, der Aufruf der DLL ist synchron, d.h. kehrt erst zur Anwendung zurück, wenn die DLL ihren Teil erledigt hat. Es gibt auch eine asynchrone Variante, aber die ist ganz anders aufgebaut. In diesem Fall ruft die Anwendung eine exportierte Funktion auf um einen sog. Callback zu installieren. Das ist eine Funktion der Hostanwendung, die die DLL aufrufen soll, wenn sie etwas an die Hostanwendung übermitteln will. Die Frage ist dann von welchem Punkt im Programmfluß aus dieser Aufruf erfolgen soll. Eine DLL führt nur dann Kode unabhängig von der Hostanwendung aus, wenn sie dafür einen sekundären Thread angelegt hat, ansonsten führt sie nur Kode als Reaktion auf einen Funktionsaufruf der Hostanwendung aus. In diesem kann sie aber durchaus einen vorher installierten Callback aufrufen, z. B. um die Hostanwendung über den Fortschritt der Arbeit zu informieren. Du hast uns ja bisher so ziemlich nichts über deine Anwendung verraten. Wenn deine TStPad-Klasse im Wesentlichen die externe DLL vom Rest der Anwendung verbergen soll würde das in etwa so funktionieren: Deine Anwendung hat einen Button mit einem normal in der IDE erzeugten Handler für den OnClick event. Der Eventhandler ruft eine public-Methode einer Instanz deiner TStPad-Klasse auf, diese Methode ruft dann die von der DLL exportierte Funktion auf.
Delphi-Quellcode:
unit PadKlasse;
interface uses Winapi.Windows, Classes; Type TStPad = class public constructor create; destructor destroy; // die wird von button.onclick aufgerufen Procedure SensorHotSpotPressed(nHotSpotID : Integer); end; implementation procedure STSensorHotSpotPressed_stdcall(nHotSpotId: Smallint);stdcall; external 'STPadLib.dll'; Procedure TStPad.SensorHotSpotPressed(nHotSpotID : Integer); begin STSensorHotSpotPressed_stdcall(nHotspotID); end; |
AW: Event aus DLL für HotSpot Nutzen
Ich kann dir gerne mal die ganze Unit per PN Schicken
Vllt bringt das dan mehr |
AW: Event aus DLL für HotSpot Nutzen
Zitat:
|
AW: Event aus DLL für HotSpot Nutzen
ok Also ich programmiere in Delphi Xe7
So was das Programm machen soll ... Es geht um ein Signpad auf diesem sind Buttons die HotSpots genannt werden und sobald ich einen der buttons Drücke soll dieses Ereignis aus der DLL die zum Signpad gehört aktiviert werden Framework is VCL Jeder Hotspot hat seine eigene ID als beispiel wenn ich Den Cancel Hotspot drücke soll die verbindung zum Signpad geschlossen werden Hoffe das konnte dir jetzt helfen |
AW: Event aus DLL für HotSpot Nutzen
Zitat:
Das sieht nach dem asynchronen Scenario aus. Was ist das für eine DLL? Ist es eine COM/ActiveX Library, ein .NET assembly, oder hat sie eine Sammlung von exportierten Funktionen? Ist da irgend eine Datei dabei, die das Interface der DLL beschreibt, ein C-Headerfile, eine type library, Dokumentation, Beispiele zur Anwendung? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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