Also bisher habe ich Folgendes versucht
Code:
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;
Du kannst keine Methode einer Klasse als external deklarieren, das geht nur mit normalen Prozeduren.
Ich versteh auch das Design nicht, was vermutlich teilweise an deiner irreführenden Verwendung von "event" liegt
. 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;