_cdecl
按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。
如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。
这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。
stdcall 和pascal一样,都是pascal的调用习惯
按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。
#define WINAPI FAR PASCAL //WINAPI系统定义的宏
在DLL中的一个使用例子
#ifndef __STREAMTOOLS_H__
#define __STREAMTOOLS_H__
#ifdef STREAMTOOLSDLL_EXPORTS
#define STREAMTOOL_API __declspec(dllexport)
#else
#define STREAMTOOL_API __declspec(dllimport)
#endif
#include <OleAuto.h>
extern "C"
{
HRESULT STREAMTOOL_API WINAPI WriteObjectToStream(IUnknown * pObj, IStream * pStm);
HRESULT STREAMTOOL_API WINAPI WriteBstrToStream(BSTR bstrValue, IStream * pStm);
}
#endif