Wer entfernt die Parameter vom Stack?

Hallo ich benutze eine aus c-quellcode erzeugte DLL.

Über diese DLL kommuniziert meine Applikation mit einer Koppelkompenente die als Dienst läuft (Betriebssystem WinXP)

In meiner Applikation muss ich der DLL mehrere Callbackfunktionen bekannt geben.

Das funktioniert im grosen und ganzen. Aber ab und zu gibt es ganz merkwürdige Effekte, dass andere Programmteile rumspinnen. Das tun sie nur dann wennn callback-Aufrufe stattgefunden haben. Es muss also mit den Callbacks zusammenhängen.

Der Quellcode einer Beispielapplikation in C sieht so aus
void FAR PASCAL AklanReceiveDatenTele(HEDE hEde, LPCSTR lpszKanalId, LPCSTR lpszVCode, LPBYTE lpbDaten, int nData);

Jetzt meine Frage an die C-Spezialisten:
wenn in C die function als „void FAR PASCAL“ deklariert ist

Wer entfernt die Parameter vom Stack?

a.) die aufrufende function
oder
b.) die aufgerufene function

Meine Applikation ist in delphi programmiert
bisher verwende ich dort die Declaration-Option

stdcall

callback-procedure
procedure AklanReceiveDatenTele(hAKLan : integer;
lpszKanalId : LPCSTR;
lpszVCode : LPCSTR;
lpbDaten : LPBYTE;
DataLen : integer); stdcall;

option stdcall bedeutet die delphi-procedure entfernt die Parameter vom stack

es gibt aber auch die Option cdecl dann entfernt der Aufrufer die Parameter vom stack

wie verhält sich das bei callback-functions?

daneben gibt es auch noch „normale“ = keine Callback-Aufrufe

function AklanSendDatenTele (hAKLan : integer;
lpszKanalId : LPCSTR;
lpszVCode : LPCSTR;
lpbDaten : LPBYTE;
nData : integer;
nSpool : integer;
nTimeout : integer
) : integer stdcall; external AKLanDLL_Name;

wer entfernt da die Parameter vom stack?

Hallo Fragewurm,

In C entfernt der Aufrufer die Parameter vom Stack
Bei PASCAL entfernt die aufgerufene Funktion die Parameter.

Mit dem Schlüsselwort PASCAL kann das in C geändert werden.

Bei deinem Callback-Problem stellen sich noch einige Fragen:

  1. Wer ruft diese Funktionen auf ?
  2. Sind die übergebenen Zeiger überhaupt gültig ?
    In diesem Zusammenhang stellt sich auch noch die Frage ob deine DLL im selben Speicherbereich wie der Aufrufer abläuft.

Durch die virtuelle Speicherverwaltung hat ja jeder Prozess den ganzen Speicher für sich alleine. Wenn jetzt einfach nur eine Speicher-Adresse an einen anderen Prozess weitergegeben wird, zeigt dieser dann an die entsprechende Adresse im anderen Task. Was dann dort steht weiss dann aber niemand.

MfG Peter(TOO)

Hallo Fragewurm,

In C entfernt der Aufrufer die Parameter vom Stack
Bei PASCAL entfernt die aufgerufene Funktion die Parameter.

Mit dem Schlüsselwort PASCAL kann das in C geändert werden.

Bei deinem Callback-Problem stellen sich noch einige Fragen:

  1. Wer ruft diese Funktionen auf ?
  2. Sind die übergebenen Zeiger überhaupt gültig ?
    In diesem Zusammenhang stellt sich auch noch die Frage ob
    deine DLL im selben Speicherbereich wie der Aufrufer abläuft.

wie kann man feststellen ob die DLL im gleichen Speicherbereich läuft?

Durch die virtuelle Speicherverwaltung hat ja jeder Prozess
den ganzen Speicher für sich alleine. Wenn jetzt einfach nur
eine Speicher-Adresse an einen anderen Prozess weitergegeben
wird, zeigt dieser dann an die entsprechende Adresse im
anderen Task. Was dann dort steht weiss dann aber niemand.

MfG Peter(TOO)

Da die Kommunikation im wesentlichen läuft,

ich sende Anfragen an die DLL und bekomme via callbackfunkion vernünftige Daten zurück muss der Grundaufbau schon stimmen

woran kann es dann noch liegen?

Hallo Fragewurm,

wie kann man feststellen ob die DLL im gleichen
Speicherbereich läuft?

Das legt man als Programmirer fest.

Da die Kommunikation im wesentlichen läuft,
ich sende Anfragen an die DLL und bekomme via callbackfunkion
vernünftige Daten zurück muss der Grundaufbau schon stimmen

woran kann es dann noch liegen?

Ungültige Zeiger, mit denen du Löcher in den Stack schiesst.
Oder Bufferoverflows.

MfG Peter(TOO)

Hallo TOO

wie man an den postings unschwer erkennen kann habe ich einen richtigen Namen

oder steht er nicht da wo bei Dir Namen im Headerfile stehen und
Du hast in nicht gesehen?

Hallo Fragewurm,

wie kann man feststellen ob die DLL im gleichen
Speicherbereich läuft?

Das legt man als Programmirer fest.

aha was ich da zwischen den Zeilen rauslese ist:

"Programmierer die richtig Ahnung haben wissen wieman das macht
Peter ist zu arrogant um es zu erklären oder einen Hilfreichen Link zu posten

Da die Kommunikation im wesentlichen läuft,
ich sende Anfragen an die DLL und bekomme via callbackfunkion
vernünftige Daten zurück muss der Grundaufbau schon stimmen

woran kann es dann noch liegen?

Ungültige Zeiger, mit denen du Löcher in den Stack schiesst.
Oder Bufferoverflows.

siehe oben

MfG Peter(TOO)

Hallo Fragewurm,

wie man an den postings unschwer erkennen kann habe ich einen
richtigen Namen

oder steht er nicht da wo bei Dir Namen im Headerfile stehen
und
Du hast in nicht gesehen?

Hier posten öfters auch Leute unter dem Account der Freundin/Freund oder Eltern/Kinder usw.
Und wieder andere haben Nicks die man eine halbe Stunde lang buchstabieren muss …

Besonders bei den ersteren Fällen habe sich etliche beschwert …

Insofern gilt für mich der Name, welcher unter den Posting steht, denn kann man dann kopieren, oder halt der Fragewurm … (Kannst du in meiner ViKa nachlesen.)

Das legt man als Programmirer fest.

aha was ich da zwischen den Zeilen rauslese ist:

"Programmierer die richtig Ahnung haben wissen wieman das
macht
Peter ist zu arrogant um es zu erklären oder einen Hilfreichen
Link zu posten

  1. Grundsätzlich ist das eine Frage des Betriebssystems.
  2. Je nach verwendeter Entwicklungsumgebung kann man das in der IDE angeben. Die eigentlich Arbeit muss dann aber der Linker erledigen.

Habe ich deine Angaben zu diesen Punkten auch überlesen ??

Mir geht es wie du in deiner ViKa schreibst:
am liebsten antworte ich auf konkrete Fragen

Dein Problem:
Ich mache etwas und ganz woanders stürzt etwas ab.

Ist ein typisches Problem in C, aber es gibt -zig Möglichkeiten was du in deinem Code dabei falsch machst.

Das einzig konkrete was man dazu sagen kann ist:

Dein Code verändert etwas, was er nicht ändern sollte !

Häufigste Ursache in C sind:

  1. Verwendung von nicht initialisierten Zeigern.
  2. Verwendung von nicht mehr aktuellen Zeigern.
  3. Bufferoverruns.

Das Ganze kann man dann noch mit dem Heap kombinieren.

MfG Peter(TOO)