Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#14

AW: Event aus DLL für HotSpot Nutzen

  Alt 28. Jun 2019, 15:31
https://workupload.com/file/fDLMb9fH

Hier einmal die Header Datei als Zip
weiß nicht ob man die auch direkt hier einfügen kann
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.
Peter Below

Geändert von peterbelow (28. Jun 2019 um 15:38 Uhr) Grund: override fehlte
  Mit Zitat antworten Zitat