why use __stdcall?

Ronald Landheer-Cieslak ronald@landheer.com
Thu Apr 17 15:02:00 GMT 2003


On Wed, 16 Apr 2003, Lester Ingber wrote:
> When using Cygwin to produce DLLs for use in other software (Excel,
> TradeStation, Maple), etc., is it necessary to insert __stdcall between
> types/typedefs and function names?  I'm just considering vanilla C code
> that runs on all platforms I've tested.
> 
> If so, is it necessary to introduce __stdcall for all functions, or only
> those that are actually called by those utilities (and these call other
> C functions, etc.).  I.e., do I have to rewrite lots of good working C
> code to introduce __stdcall throughout all code?
No. Generally you can handle it with a couple of compiler flags and 
perhaps a well-written .def file.

> If I do not use __stdcall (I do not seem to need this for simple cases?),
> what dangers lurk?
Stack corruption.

What you need to is make sure that the calling convention used by your 
function is the same as the one expected by the calling program. A 
well-placed -mrtd will do the trick if you want the stdcall convention 
without the name mangling - this works for JNI DLLs and, I think, will 
probably work for Excel-invoked DLLs as well.

> To be explicit, I am creating DLLs and .def files using scripts like:
> set module = mydll
> gcc -c ${module}.c
    ^^^ add -mrtd here

> set old_lib = ${module}.o
> gcc -shared -mno-cygwin -o ${module}.dll \
>     -Wl,--out-implib=lib${module}.a \
>     -Wl,--export-all-symbols \
>     -Wl,--export-dynamic \
>     -Wl,--add-stdcall-alias \
>     -Wl,--enable-auto-import \
>     -Wl,--output-def=${module}.def \
>     -Wl,--whole-archive ${old_lib} \
>     -Wl,--no-whole-archive ${dependency_libs}
> 
HTH

rlc



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list