Man kann Dateianhänge an Forum-Posts anhängen. Wenn Du den POst schreibst ist unter dem Eingabefenster eine Sektion "zusätzliche Einstellungen" und dortselbst findet sich ein "Anhänge verwalten"-Knopf, der einen zu einer Seite bringt, wo man eine Datei ins Forum laden kann.
Anyway, nachdem ich erstmal die Übelkeit überwunden hatte, die mich beim Lesen von C-Kode immer befällt
sieht es so aus, als wenn die
DLL wirklich einen asynchronen Benachrichtigungsmechanismus unterstützt.
Code:
// callback typedef
typedef VOID (*CBPTR)(LONG nEvent, LPVOID pData, LONG nDataSize, LPVOID pCustomPar);
Das entspricht der Delphi-Deklaration
Delphi-Quellcode:
type
TStPadCallback = procedure (nEvent: Longint; pData: Pointer; nDatasize: Longint;
pCustomPar: pointer); cdecl;
Installiert wird ein solcher callback offenbar mit Hilfe einer der beiden exportierten Funktionen
Code:
extern "C" STPADLIB_API VOID STControlSetCallback(CBPTR pCallback, LPVOID pCustomPar);
extern "C" STPADLIB_API VOID __stdcall STControlSetCallback_stdcall(CBPTR pCallback, LPVOID pCustomPar);
Die unterscheiden sich nur in der calling convention und so wie der Header aussieht ist die stdcall-Variante nur in der 32-Bit
DLL verfügbar. Beide sind aus Delphi verwendbar.
Deine Klasse sollte dann etwa so aussehen:
Delphi-Quellcode:
Type
TStPad = class
private
procedure InstallCallback;
procedure UninstallCallback;
public
constructor create;
destructor destroy; override;
procedure SensorHotSpotPressed(nHotSpotID : Integer);
end;
// in implementation section
type
TStPadCallback = procedure (nEvent: Longint; pData: Pointer; nDatasize: Longint;
pCustomPar: pointer); cdecl;
procedure STControlSetCallback(pCallback: TStPadCallback; pCustomPar: pointer); cdecl;
external 'STPadLib.dll';
procedure STControlSetCallback_stdcall(pCallback: TStPadCallback; pCustomPar: pointer);
stdcall; external 'STPadLib.dll';
const
// callback event IDs
STPAD_CALLBACK_DISCONNECT = 0;
STPAD_CALLBACK_HOTSPOT = 1;
STPAD_CALLBACK_TIMEOUT = 2;
STPAD_CALLBACK_SCROLL = 3;
STPAD_CALLBACK_SIGNATURE = 4;
procedure CallbackStub (nEvent: Longint; pData: Pointer; nDatasize: Longint;
pCustomPar: pointer); cdecl;
var
LHotspotID: integer;
begin
if nEvent = STPAD_CALLBACK_HOTSPOT then
if Assigned(pData) and (nDatasize = sizeof(integer)) then begin
LHotspotID := pInteger(pData)^;
if Assigned(pCustomPar) then
TStPad(pCustomPar).SensorHotSpotPressed(LHotspotID);
end;
end;
{ TStPad }
constructor TStPad.create;
begin
inherited;
InstallCallback;
end;
destructor TStPad.destroy;
begin
UninstallCallback;
end;
procedure TStPad.InstallCallback;
begin
STControlSetCallback(CallbackStub, Self);
end;
procedure TStPad.SensorHotSpotPressed(nHotSpotID: Integer);
begin
end;
procedure TStPad.UninstallCallback;
begin
STControlSetCallback(nil, Self);
end;
Du mußt mal die Dokumentation checken um zu verifizieren, wie der Callback die ID des Hotspots übergeben bekommt, da konnte ich natürlich nur spekulieren.