Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Event aus DLL für HotSpot Nutzen (https://www.delphipraxis.net/201107-event-aus-dll-fuer-hotspot-nutzen.html)

Johnny123 27. Jun 2019 11:16

AW: Event aus DLL für HotSpot Nutzen
 
Ja richtig genau Soll halt bei Cancel die verbindung schließen bei Okay auf Unterschrift wechseln etc

Es gibt eine C-Header Datei und eine Dokumentation zu der DLL
Hab noch diverse andere Funktionen aus DLL exportiert die funktionieren soweit auch super

nur mit dem Ereignis hab ich halt ein Problem

peterbelow 27. Jun 2019 11:43

AW: Event aus DLL für HotSpot Nutzen
 
Zitat:

Zitat von Johnny123 (Beitrag 1435479)
Ja richtig genau Soll halt bei Cancel die verbindung schließen bei Okay auf Unterschrift wechseln etc

Es gibt eine C-Header Datei und eine Dokumentation zu der DLL
Hab noch diverse andere Funktionen aus DLL exportiert die funktionieren soweit auch super

nur mit dem Ereignis hab ich halt ein Problem

Ich müßte die Header-Datei sehen um Dir da weiterhelfen zu können. Kannst Du die in ein zip-Archiv packen und als Anhang an deine Antwort hängen?

Johnny123 28. Jun 2019 09:40

AW: Event aus DLL für HotSpot Nutzen
 
https://workupload.com/file/fDLMb9fH

Hier einmal die Header Datei als Zip
weiß nicht ob man die auch direkt hier einfügen kann

peterbelow 28. Jun 2019 14:31

AW: Event aus DLL für HotSpot Nutzen
 
Zitat:

Zitat von Johnny123 (Beitrag 1435537)
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 :wink: 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.

Johnny123 2. Jul 2019 15:14

AW: Event aus DLL für HotSpot Nutzen
 
Sobald ich zeit habe werde ich es mal austesten
und melde mich dan wieder

Johnny123 16. Jul 2019 09:12

AW: Event aus DLL für HotSpot Nutzen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo peterbelow

also habe es soweit eingebaut nur Kackt jetzt alles ab sobald ich den Hotspot drücke und kriege folgende fehlermeldung
und er öffnet in Delphi das CPU fenster
hab ich als Anhang mal screens von rein gesetzt

hoika 16. Jul 2019 09:15

AW: Event aus DLL für HotSpot Nutzen
 
Hallo,
und wo genau, an welcher Stelle des Quellcodes ?

peterbelow 16. Jul 2019 09:21

AW: Event aus DLL für HotSpot Nutzen
 
Zitat:

Zitat von Johnny123 (Beitrag 1436826)
Hallo peterbelow

also habe es soweit eingebaut nur Kackt jetzt alles ab sobald ich den Hotspot drücke und kriege folgende fehlermeldung
und er öffnet in Delphi das CPU fenster
hab ich als Anhang mal screens von rein gesetzt

Sieht so aus als wenn die DLL intern auf einen Fehler läuft. Wenn Du einen breakpoint auf die erste Kodezeile in CallbackStub setzt, wird der noch erreicht?

Johnny123 16. Jul 2019 10:45

AW: Event aus DLL für HotSpot Nutzen
 
if nEvent = STPAD_CALLBACK_HOTSPOT then

von der zeile aus sprint er direkt zum Ende hin

und als nEvent zeigt er eine zahl an 6194160

peterbelow 16. Jul 2019 13:34

AW: Event aus DLL für HotSpot Nutzen
 
Zitat:

Zitat von Johnny123 (Beitrag 1436837)
if nEvent = STPAD_CALLBACK_HOTSPOT then

von der zeile aus sprint er direkt zum Ende hin

und als nEvent zeigt er eine zahl an 6194160

Mh, ändere mal die calling convention für den callback typ und für CallbackStub auf stdcall statt cdecl.

Ich kenne mich nicht so besonders aus mit C/C++, vielleicht habe ich die Deklaration im Header falsch interpretiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr.
Seite 2 von 3     12 3      

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