Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Externe C++ DLL Mit Callback Pointer nutzen (https://www.delphipraxis.net/50171-externe-c-dll-mit-callback-pointer-nutzen.html)

Loewentier 21. Jul 2005 14:46


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

UweR 21. Jul 2005 15:15

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.

Loewentier 21. Jul 2005 15:42

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:

Robert Marquardt 21. Jul 2005 17:40

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.

Loewentier 21. Jul 2005 18:09

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

Olli 21. Jul 2005 19:23

Re: Externe C++ DLL Mit Callback Pointer nutzen
 
Zitat:

Zitat von Loewentier
typedef long (__stdcall * PCALL_BACK_FUNCT) (char * BUFFER);

ist gleich:
Delphi-Quellcode:
type PCALL_BACK_FUNCT = function(BUFFER: PChar): Longint; stdcall;
Zitat:

Zitat von Loewentier
typedef long (__stdcall * lpInitInstrument) (long MODE, long INTERFACE, long FAR * pINTEGRATION_TIMES, char * pCALIBRATION_RECORD);

ist gleich:
Delphi-Quellcode:
type lpInitInstrument = function(MODE: Longint; INTERFACE: Longint; var INTEGRATION_TIMES: Longint; pCALIBRATION_RECORD: PChar): Longint; stdcall;
usw.

:wall: ... vergessen:

Zitat:

Zitat von Loewentier
Mein Problem Aufruf:
typedef long (__stdcall * lpStartCalibration) (long PARAM, PCALL_BACK_FUNCT * CALIBR_IS_DONE);

ist gleich:
Delphi-Quellcode:
type lpStartCalibration = function(PARAM: Longint; var CALIBR_IS_DONE: PCALL_BACK_FUNCT): Longint; stdcall;

Loewentier 21. Jul 2005 20:50

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:
Resul := lpStartCalibration(DLL_StartCalibration)(0, PCALL_BACK_FUNCT(CalibrationRecord));
kann ich die Fremd DLL starten, mir fehlt aber offensichtlich der Callback Empfänger um die Daten zu empfangen.
Alle Versuche in der Funktions Aufruf oben statt
Delphi-Quellcode:
PCALL_BACK_FUNCT(CalibrationRecord)
hier so etwas wie
Delphi-Quellcode:
@EmpfangFunktion
zu schreiben funzen nicht.

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:

Loewentier 22. Jul 2005 16:45

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:
  CALL_BACK_FUNCT := @DLL_CALL_BACK_Calibration;
  if lpStartCalibration(DLL_Adress_StartCalibration)(0, CALL_BACK_FUNCT) <> 0 then begin
die Gegenstelle.
Delphi-Quellcode:
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;
DANKE für eure Hilfe


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