首页
社区
课程
招聘
[讨论]WIN32 API 函数除了wsprintf需要调用者平衡椎栈外,还有printf,sprintf这些也是吧?
发表于: 2008-5-29 13:48 4387

[讨论]WIN32 API 函数除了wsprintf需要调用者平衡椎栈外,还有printf,sprintf这些也是吧?

2008-5-29 13:48
4387
我看加密与解密第二版中提到,WIN32 API 函数中只有wsprintf是C调用约定外,其它的都是StdCall,难道printf,sprintf这些可变参数个数的函数不需要C调用约定么?

困惑。请各种帮忙解答一下吧,小弟感激不尽!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
另外想问下 在VC中有这样的宏定义:#define   PASCAL   __stdcall, 可加密与解密第二版中说pascal和_stdcall这两种调用约定是不同的,参数传递前者是从左到右,后者是从右到左,可VC似乎把这两者等同了,怎么回事呢?

呵呵,谢谢了!
2008-5-29 14:19
0
雪    币: 44229
活跃值: (19960)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
当初说法太绝对了,除了wsprintf外,还有一些是C调用约定。好像API函数名是小写字母的,大多是C调用约定(没太多验证,仅供参考)。
2008-5-29 14:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢kanxue !
另外:
另外想问下 在VC中有这样的宏定义:#define   PASCAL   __stdcall, 可加密与解密第二版中说pascal和_stdcall这两种调用约定是不同的,参数传递前者是从左到右,后者是从右到左,可VC似乎把这两者等同了,怎么回事呢?

顺便也帮忙解答一下吧,呵呵,THANKS!
2008-5-29 14:57
0
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
这里只说一下方法,具体结果需要实验确定。
1. #define   PASCAL   __stdcall,
首先要确定该宏是否有效, VC 的宏经常被一些条件编译选项包围着
所以当你看到一个宏时,它并不一定能起作用。
2. 你可以写个小程序实验一下,把它那句话屏蔽掉, 或者放到自己的头文件等, 预祝你能成功得到答案!
3. pascal 和 _stdcall 调用肯定是不一样的,要不为啥起两个名字呢。
2008-5-29 15:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
查了下VC6下的相关宏定义,是这样的
-----------------------------------------
#ifdef _MAC
#define CALLBACK    PASCAL
#define WINAPI      CDECL
#define WINAPIV     CDECL
#define APIENTRY    WINAPI
#define APIPRIVATE  CDECL
#ifdef _68K_
#define PASCAL      __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY    WINAPI
#define APIPRIVATE
#define PASCAL      pascal
#endif
-------------------------------------
由此可见,不同的编绎环境下PASCAL宏代表的调用约定不一样,但不用怀疑的是大写的PASCAL和小写的pascal显然不是同一个意思,另外stdcall和pascal显然不是同一个调用约定,呵呵,我大概清楚了,谢谢各位!
2008-5-29 17:06
0
游客
登录 | 注册 方可回帖
返回
//