Einzelnen Beitrag anzeigen

GHorn

Registriert seit: 24. Mär 2009
Ort: NRW
124 Beiträge
 
#1

Event aus c++ DLL auswerten

  Alt 24. Mär 2015, 13:07
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)
Angehängte Dateien
Dateityp: txt DLL_Event.txt (7,0 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat