Martin Tröster wrote:

Hi,

- Stdcall vs. cdecl
How do I find out whether a function uses CDECL instead of STDCALL? I found the 
information (link lost unfortunately) that entries in the def file like [EMAIL 
PROTECTED] are called via STDCALL, whereas in case of testfunc2 without any @ 
specifying the space is CDECL. Is this guess right? If not, how else do I find this 
out?



STDCALL means PASCAL call format. This means two things, mostly. First - it means arguments are pushed on the stack left to right instead of right to left (no way you can pass printf style variable length arguments). The second is that it is the functions' responsibility, rather than the caller, to remove the arguments from the stack.

With the C calling convention, if the caller places more arguments on the stack than the function expects, nothing bad will happen. The same caller (that presumably knows how much arguments there are on the stack) releases the stack. As the arguments are pushed right to left, the first argument is always in the same position in relation to the stack pointer when calling the function. This means that if the function expects three arguments, and the caller sends 4, noone will ever notice (assuming the first three are understood correctly, of course).

With the Pascal calling convention, such a case is disastrous. As the arguments are cleared by the called function, if it thinks there is a different number or arguments on the stack than there really is, the function will return to the caller with the stack pointer in the wrong place. The program is most likely to crash the moment any further stack activity takes place.

In order to avoid this problem, STDCALL functions mangle into the function's name a number indicating the number of bytes the arguments for the function take on the stack. This gives a certain assurance that a mismatch between caller and callee notion of what the arguments are will be translated into a linker failure, rather than inexplicable, seemingly random, runtime crashes.

Warning: the following paragraph is pure guesswork. The long explanation was just a way to say that your idea that symbols that have the form of "[EMAIL PROTECTED]" are STDCALL symbols, while symobls that are pure name are CDECL, seems the only way to understand things.

Thanks again for any help!

Cheers,
Martin


Shachar

--
Shachar Shemesh
Open Source integration consultant
Home page & resume - http://www.shemesh.biz/





Reply via email to