AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Externe C++ DLL Mit Callback Pointer nutzen
Thema durchsuchen
Ansicht
Themen-Optionen

Externe C++ DLL Mit Callback Pointer nutzen

Ein Thema von Loewentier · begonnen am 21. Jul 2005 · letzter Beitrag vom 22. Jul 2005
Antwort Antwort
Loewentier

Registriert seit: 21. Jul 2005
Ort: Freiburg
18 Beiträge
 
#1

Externe C++ DLL Mit Callback Pointer nutzen

  Alt 21. Jul 2005, 15:46
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.

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.
DANKE
  Mit Zitat antworten Zitat
UweR

Registriert seit: 15. Mär 2004
Ort: Bad Marienberg
219 Beiträge
 
Delphi 7 Professional
 
#2

Re: Externe C++ DLL Mit Callback Pointer nutzen

  Alt 21. Jul 2005, 16:15
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.
Gruß
UweR
  Mit Zitat antworten Zitat
Loewentier

Registriert seit: 21. Jul 2005
Ort: Freiburg
18 Beiträge
 
#3

Re: Externe C++ DLL Mit Callback Pointer nutzen

  Alt 21. Jul 2005, 16:42
Hallo UweR,

Danke für die super schnelle Antwort
Denke das hilft mir schon mal weiter...

Offensichtlich sehe ich den Wald vor lauter Bäumen nicht.
Mal schauen ob ichs hinbekomme
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Externe C++ DLL Mit Callback Pointer nutzen

  Alt 21. Jul 2005, 18:40
Ich wuerde mal vermuten das du beide Funktionen stdcall deklarieren musst.
Zeig doch mal die C Deklarationen damit man sicher sein kann.
  Mit Zitat antworten Zitat
Loewentier

Registriert seit: 21. Jul 2005
Ort: Freiburg
18 Beiträge
 
#5

Re: Externe C++ DLL Mit Callback Pointer nutzen

  Alt 21. Jul 2005, 19:09
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 die Lage

Danke
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: Externe C++ DLL Mit Callback Pointer nutzen

  Alt 21. Jul 2005, 20:23
Zitat von Loewentier:
typedef long (__stdcall * PCALL_BACK_FUNCT) (char * BUFFER);
ist gleich:
type PCALL_BACK_FUNCT = function(BUFFER: PChar): Longint; stdcall;
Zitat von Loewentier:
typedef long (__stdcall * lpInitInstrument) (long MODE, long INTERFACE, long FAR * pINTEGRATION_TIMES, char * pCALIBRATION_RECORD);
ist gleich:
type lpInitInstrument = function(MODE: Longint; INTERFACE: Longint; var INTEGRATION_TIMES: Longint; pCALIBRATION_RECORD: PChar): Longint; stdcall; usw.

... vergessen:

Zitat von Loewentier:
Mein Problem Aufruf:
typedef long (__stdcall * lpStartCalibration) (long PARAM, PCALL_BACK_FUNCT * CALIBR_IS_DONE);
ist gleich:
type lpStartCalibration = function(PARAM: Longint; var CALIBR_IS_DONE: PCALL_BACK_FUNCT): Longint; stdcall;
  Mit Zitat antworten Zitat
Loewentier

Registriert seit: 21. Jul 2005
Ort: Freiburg
18 Beiträge
 
#7

Re: Externe C++ DLL Mit Callback Pointer nutzen

  Alt 21. Jul 2005, 21:50
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:
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 PCALL_BACK_FUNCT(CalibrationRecord) hier so etwas wie @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.
DANKE für eure Hilfe
  Mit Zitat antworten Zitat
Loewentier

Registriert seit: 21. Jul 2005
Ort: Freiburg
18 Beiträge
 
#8

Re: Externe C++ DLL Mit Callback Pointer nutzen

  Alt 22. Jul 2005, 17:45
Hallo Leute,

Habe die Lösung zu meinem Problem gefunden
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
  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 13:18 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