![]() |
C: DLL und Callback Aufruf mit Delphi Parameterübergabe
Hi,
Das Problem was ich habe ist: Es funktioniert alles tadellos, bis auf die Parameterübergabe an die Callback-Funktion. Egal was ich auch anstelle ich bekomme immer 4518732 zurück. Ich habe, aus diesem Grunde schon in calcresults eine feste int eingegeben. habe folgenden Code geschrieben: callb.h
Code:
callb.cpp
#ifndef CALLB_H
#define CALLB_H #include "callb_global.h" #endif // CALLB_H typedef bool (CALLBACK(CallbackFunc)(int)); extern "C" void calcresults(CallbackFunc* Callback, DWORD UserData);
Code:
#include <windows.h>
#include "callb.h" BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD Reason, LPVOID Reserved) { if(Reason==DLL_PROCESS_ATTACH) { return TRUE; } if(Reason==DLL_PROCESS_DETACH) { return TRUE; } return FALSE; } extern "C" __declspec( dllexport ) void calcresults(CallbackFunc* Callback, DWORD UserData) { int z=15; Callback(z); }
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; function calcresults(s:pointer;a:dword):boolean;cdecl ; //cdecl var Form1: TForm1; implementation {$R *.dfm} function calcresults(s:pointer;a:dword):boolean;cdecl ;external 'callb.dll'; //cdecl function Zielfunktion(j:integer):boolean; begin form1.label1.caption:=inttostr(j); end; procedure TForm1.Button1Click(Sender: TObject); begin calcresults(@Zielfunktion,5); end; end. Vielen dank im Vorraus Rainer |
Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe
Hallo "R2009";
Mir ist folgendes aufgefallen. 1. Im Headerfile sollte typedef bool (__cdecl((CallbackFunc)(int))); stehen (Klammern, und cdecl anstatt stdcall!!) 2. procedure calcresults(ptr: pointer; dwData: dword); cdecl ;external 'callb.dll'; 3. function Zielfunktion(j: integer): LongBool; cdecl; Sollte so funktionieren, versuchs mal. lg. Astat |
Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe
Ok funktioniert,
kannst du mir jetzt noch erkären was ich falsch gemacht habe? Liegt es daran, dass hinter Zielfunction cdecl steht? Wo landet der Rückgabewert auf dem Heap oder auf dem Stack? Grüsse Rainer |
Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe
Der Rückgabewert landet hier im Register EAX. Das hängt aber vom Typ des Rückgabeparameters ab. Ist aber bei cdecl und stdcall identisch (und für den Rückgabewert auch bei allen anderen gängigen Aufrufkonventionen). Der einzige Unterschied zwischen den beiden Aufrufkonventionen besteht darin, wer den Stack aufräumt. bei stdcall macht es die Funktion, bei cdecl der die Funktion aufrufende Code. Und entweder räumst du gar nicht oder gleich zweimal den Stack auf (wobei Aufräumen nur bedeutet, den Stackpointer einfach je nach Parameter-zahl und -typen zu verschieben). Danach sind alle Zugriffe auf lokale Variablen falsch. und wenn es da noch nicht knallt, dann spätestens, wenn du das nächste Mal eine Funktion verlässt, weil er die Rücksprungaddresse nicht mehr hat.
|
Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe
Hi Sirius,
habs kapiert. Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 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