Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Event aus c++ DLL auswerten (https://www.delphipraxis.net/184412-event-aus-c-dll-auswerten.html)

GHorn 24. Mär 2015 13:07

Event aus c++ DLL auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo an alle,

ich möchte aus einer Fremd-DLL, die in C++ geschrieben ist, ein Event auswerten. Ich habe ein in C++ geschriebenes Beispiel, dass mir aber nicht die nötige Erleuchtung bringt, das Ganze nach Delphi umzusetzen.
In der angehängten TXT-Datei sind sowohl ausführlichere Auszüge der Header- als auch der CPP-Datei. Außerdem habe ich den Teil meiner bisherigen kläglichen Bemühungen in Delphi dort eingetragen.

Hier die kürzere Fassung:

H-File:
Code:
  typedef void (I1_CALLING_CONVENTION *FPtr_I1_DeviceEventHandler)(I1_DeviceHandle devHndl, I1_DeviceEvent event, void *context);
  void MyDeviceEventFunction(I1_DeviceHandle devHndl, I1_DeviceEvent event, void *context)
  FPtr_I1_DeviceEventHandler I1_RegisterDeviceEventHandler(FPtr_I1_DeviceEventHandler handler, void *context);
  typedef FPtr_I1_DeviceEventHandler (I1_CALLING_CONVENTION *FPtr_I1_RegisterDeviceEventHandler)(FPtr_I1_DeviceEventHandler, void*);
CPP-File:
Code:
void MyDeviceEventFunction(I1_DeviceHandle devHndl, I1_DeviceEvent event, void *refCon);
void DeviceEventHandlerDemo();


// This function is called if an event happens
void MyDeviceEventFunction(I1_DeviceHandle devHndl, I1_DeviceEvent event, void *refCon)
{
  // increase our event counter
  int *eventCounter = static_cast<int*>(refCon);
  *eventCounter += 1;

  std::cout << "Event #" << *eventCounter;
  switch(event) {
    case eI1ProButtonPressed: std::cout << " 'Button pressed' 0x" << std::hex << devHndl << std::dec << std::endl; break;
    case eI1ProScanReadyToMove:std::cout << " 'Ready to move'  0x" << std::hex << devHndl << std::dec << std::endl; break;
    case eI1ProLampRestore:   std::cout << " 'Lamp restore'   0x" << std::hex << devHndl << std::dec << std::endl; break;
    case eI1ProArrival:       std::cout << " 'Device attached' 0x" << std::hex << devHndl << std::dec << std::endl; break;
    case eI1ProDeparture:     std::cout << " 'Device removed' 0x" << std::hex << devHndl << std::dec << std::endl; break;
  }
}


// This function demonstrates the device event handler usage
void DeviceEventHandlerDemo()
{
  std::cout << "\n\n------------------------------" << std::endl;
  std::cout << " Device Event Handler demonstration" << std::endl;

  int eventCounter = 0; // number of events
  // register our event handler with eventCounter
  I1_RegisterDeviceEventHandler(&MyDeviceEventFunction, &eventCounter);

  // ....
  // ....
  // ....

  // Unregister our event handler
  I1_RegisterDeviceEventHandler(NULL, NULL);
}

Meine Versuche in Delphi:

Delphi-Quellcode:
type
  TEventEnum = (eI1ProbuttonPressed = $01, I1ProScanReadyToMove = $02, eI1ProLampRestore = $03,
                eI1ProArrival = $11, eI1ProDeparture = $12);

var
  // Register DLL function:
  I1_RegisterDeviceEventHandler: procedure(iH: THandle; var EventCounter: integer); cdecl;

  // Own event procedure:
  procedure MyDeviceEventFunction(iH: THandleArray; MyEvent: TEventEnum; var refCounter: integer);


implementation

uses .....


// *****************************************************************
// Register the Event-Handler:
// *****************************************************************

function IsConnected: integer;
var
  p: Pointer;
begin
  Result := 0; // Default kein Fehler

  // Register the Event-Handler:
  // Hier kommen die Fehlermeldungen des Compilers:
  // a)
  I1_RegisterDeviceEventHandler(^MyDeviceEventFunction, p);  // -> Fehler: Inkompatible Typen 'Cardinal' und 'Char'
  // b)
  I1_RegisterDeviceEventHandler(@MyDeviceEventFunction, p);  // -> Fehler: Inkompatible Typen 'Cardinal' und 'Pointer'


end;



// *****************************************************************
// Own procedure for event:
// *****************************************************************

procedure MyDeviceEventFunction(iH: THandleArray; MyEvent: TEventEnum; var refCounter: integer);
// This procedure is called if an event happens:
begin
  ShowMessage('Event');   // Dummy -> event fired
end;

In der Delphi-Funktion IsConnected kommen die Compilerfehlermeldungen wie dort beschrieben (Inkompatible Typen.....). Meine Definitionen/Deklarationen sind offensichtlich falsch. Ich weiß aber nicht - trotz langer Suche im INet - wo ich den Hebel ansetzen muss.
Daher bin ich für jeden Hinweis dankbar.
Sollte ich noch entscheidende Dinge zum Verständnis vergessen haben anzufügen, bitte anmeckern.

Vielen Dank,
Gerald

P.S.: Version Delphi 2007 (2009)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz