AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Event aus c++ DLL auswerten

Ein Thema von GHorn · begonnen am 24. Mär 2015
Antwort Antwort
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
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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