![]() |
Externe C++ DLL Mit Callback Pointer nutzen
Hallo Leute
habe ein Problem wo ich im Moment absolut nicht weiter komme. Ich muß von einer meiner DLL's aus eine fremde C++ Dll ansteuern. Nach diversen Interaktionen der anderen Seite sollte ich dann (Minuten später!) ein gefülltes Ergebniss Array von dem DLL Aufruf zurückbekommen. Bisher schaffe ich es aber nur den Aufruf an die fremde Dll zuschicken, wobei mein Programm danach ohne zu warten weiterläuft. :gruebel: Der Code bei mir sieht so aus: TYPE TDLL_CALL_BACK_FUNCT = Function (VAR Buffer: PChar): Integer; TDLL_STARTCALIBRATION = Function(PARAM : Integer; VAR CALIBR_IS_DONE: TDLL_CALL_BACK_FUNCT): Integer; VAR CALL_BACK_FUNCT : TDLL_CALL_BACK_FUNCT; DLL_StartCalibration : TDLL_STARTCALIBRATION; CODE BLOCK DLL_StartCalibration := GetProcAddress(Hlib, 'StartCalibration'); Resul := TDLL_StartCalibration(DLL_StartCalibration)(0, TDLL_CALL_BACK_FUNCT(CalibrationRecord)); if (Resul <> 0) and (CalibrationRecord <> '') then begin Wie kann ich es erreichen das mein Programm Ablauf mit dem DLL Aufruf anhält. :wall: DANKE |
Re: Externe C++ DLL Mit Callback Pointer nutzen
Hallo Loewentier,
erst mal Willkommen im Forum! Jetzt zu deinem Problem. da ist glaube ich erst mal etwas Erklärungsbedarf in Sachen Callback. Du kriegst nicht direkt ein Array vor die Füße geworfen, sondern wenn die DLL ausgenudelt hat ruft sie die Funktion auf die du ihr als CallbackFunktion übergeben hast. CalibrationRecord darf in diesem Fall also kein Feld sein, wonach es bei dir aussieht, sondern muß eine Funktion sein die du mit Leben füllen mußt und die die Daten irgendwei auswerten muß. Zu beachten ist hierbei auch der Rückgabewert der Funktion, da gibts bestimmt ne Beschreibung zu wie der auszusehen hat. Das bedeutet auch das dein Programm mit dem DLL-Aufruf nicht anhalten muß. Es kann einfach in der Gegend rumidlen bis die DLL die CallBack-Funktion aufruft. |
Re: Externe C++ DLL Mit Callback Pointer nutzen
Hallo UweR,
Danke für die super schnelle Antwort :-D Denke das hilft mir schon mal weiter... Offensichtlich sehe ich den Wald vor lauter Bäumen nicht. Mal schauen ob ichs hinbekomme :gruebel: |
Re: Externe C++ DLL Mit Callback Pointer nutzen
Ich wuerde mal vermuten das du beide Funktionen stdcall deklarieren musst.
Zeig doch mal die C Deklarationen damit man sicher sein kann. |
Re: Externe C++ DLL Mit Callback Pointer nutzen
In einer C++ Demo Applikation die mir zum ansprechen der Dll zur Verfügung steht sehen die Aufrufe so aus:
typedef long (__stdcall * PCALL_BACK_FUNCT) (char * BUFFER); Einige einfache Sachen typedef long (__stdcall * lpInitInstrument) (long MODE, long INTERFACE, long FAR * pINTEGRATION_TIMES, char * pCALIBRATION_RECORD); etc. Mein Problem Aufruf: typedef long (__stdcall * lpStartCalibration) (long PARAM, PCALL_BACK_FUNCT * CALIBR_IS_DONE); Hoffe das klärt für die Cracks :idea: die Lage Danke |
Re: Externe C++ DLL Mit Callback Pointer nutzen
Zitat:
Delphi-Quellcode:
type PCALL_BACK_FUNCT = function(BUFFER: PChar): Longint; stdcall;
Zitat:
Delphi-Quellcode:
usw.
type lpInitInstrument = function(MODE: Longint; INTERFACE: Longint; var INTEGRATION_TIMES: Longint; pCALIBRATION_RECORD: PChar): Longint; stdcall;
:wall: ... vergessen: Zitat:
Delphi-Quellcode:
type lpStartCalibration = function(PARAM: Longint; var CALIBR_IS_DONE: PCALL_BACK_FUNCT): Longint; stdcall;
|
Re: Externe C++ DLL Mit Callback Pointer nutzen
Vielen Dank für all die Hilfe Versuche
Aber mein Problem ist auch mit besseren Übersetzungen der C Header nicht gelöst :| Wie bekomme ich nach dem DLL Funktions Aufruf meine Variable "CalibrationRecord" gefüllt zurück . Mit meinem einfachen Aufruf:
Delphi-Quellcode:
kann ich die Fremd DLL starten, mir fehlt aber offensichtlich der Callback Empfänger um die Daten zu empfangen.
Resul := lpStartCalibration(DLL_StartCalibration)(0, PCALL_BACK_FUNCT(CalibrationRecord));
Alle Versuche in der Funktions Aufruf oben statt
Delphi-Quellcode:
hier so etwas wie
PCALL_BACK_FUNCT(CalibrationRecord)
Delphi-Quellcode:
zu schreiben funzen nicht.
@EmpfangFunktion
Kenne einige Beispiele von Callback von Windows Funktionen (EnumFonts) die sehr einfach über die Übergabe der Funktionsadresse funktionieren. Hier komme ich einfach nicht weiter. :wall: DANKE für eure Hilfe :angel: |
Re: Externe C++ DLL Mit Callback Pointer nutzen
Hallo Leute,
Habe die Lösung zu meinem Problem gefunden :-D Mir fehlte zu meinem DLL Aufruf
Delphi-Quellcode:
die Gegenstelle.
CALL_BACK_FUNCT := @DLL_CALL_BACK_Calibration;
if lpStartCalibration(DLL_Adress_StartCalibration)(0, CALL_BACK_FUNCT) <> 0 then begin
Delphi-Quellcode:
DANKE für eure Hilfe
Function DLL_CALL_BACK_Calibration(VAR Buffer: PChar): Longint; STDCall;
begin CalibrationRecord := Buffer; MessageDLG('Calibration Data successfully recorded !', mtInformation, [mbOK], 0); end; DLL_CALL_BACK_Calibration := 0; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr. |
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