AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C: DLL und Callback Aufruf mit Delphi Parameterübergabe
Thema durchsuchen
Ansicht
Themen-Optionen

C: DLL und Callback Aufruf mit Delphi Parameterübergabe

Ein Thema von R2009 · begonnen am 20. Dez 2009 · letzter Beitrag vom 20. Dez 2009
Antwort Antwort
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

C: DLL und Callback Aufruf mit Delphi Parameterübergabe

  Alt 20. Dez 2009, 08:11
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe

  Alt 20. Dez 2009, 09:58
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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#3

Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe

  Alt 20. Dez 2009, 10:05
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe

  Alt 20. Dez 2009, 10:17
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#5

Re: C: DLL und Callback Aufruf mit Delphi Parameterübergabe

  Alt 20. Dez 2009, 10:29
Hi Sirius,
habs kapiert.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  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 01:06 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