Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C: DLL und Callback Aufruf mit Delphi Parameterübergabe (https://www.delphipraxis.net/144939-c-dll-und-callback-aufruf-mit-delphi-parameteruebergabe.html)

R2009 20. Dez 2009 07:11


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:
#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);
callb.cpp
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

Astat 20. Dez 2009 08:58

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

R2009 20. Dez 2009 09:05

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

sirius 20. Dez 2009 09:17

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.

R2009 20. Dez 2009 09:29

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 13:58 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