关于win32 函数的疑问

daijiandong3072 2010-02-05 08:42:08
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)
这个函数声明怎么跟c++的函数定义不一样,c++的定义应该是int WinMain(...)吧,已经有了返回类型int了,中间多了个winapi 有什么意思??(本人菜鸟,高手指教一下,最好详细点)
...全文
282 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyjjsn 2010-02-08
  • 打赏
  • 举报
回复
学习了。
mstlq 2010-02-07
  • 打赏
  • 举报
回复
c++默认是__cdecl
daijiandong3072 2010-02-07
  • 打赏
  • 举报
回复
baidu了一下函数调用约定,了解了一些,c++没有怎么都没见过这个,还是有默认的?
r_swordsman 2010-02-06
  • 打赏
  • 举报
回复
The following calling conventions are supported by the Visual C/C++ compiler.

Keyword / Stack cleanup / Parameter passing

__cdecl / Caller / Pushes parameters on the stack, in reverse order (right to left)

__clrcall / n/a / Load parameters onto CLR expression stack in order (left to right).

__stdcall / Callee / Pushes parameters on the stack, in reverse order (right to left)

__fastcall / Callee / Stored in registers, then pushed on stack

__thiscall / Callee / Pushed on stack; this pointer stored in ECX


The __pascal, __fortran, and __syscall calling conventions are no longer supported. You can emulate their functionality by using one of the supported calling conventions and appropriate linker options.

WINDOWS.H now supports the WINAPI macro, which translates to the appropriate calling convention for the target. Use WINAPI where you previously used PASCAL or __far __pascal.


haha_ 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jackyjkchen 的回复:]
引用 6 楼 haha_ 的回复:
见过无耻的 还没见过楼上这么无耻的

你第一次写的没错 在windows下 大写的PASCAL 就是_stdcall
pascal的参数压栈顺序跟stdcall正好相反,哪来的调用方式会一样。

淡定,先看你自己说的话一会说PASCAL和__stdcall一样,一会说pascal压栈方式与_stdcall相反。

到底是谁无耻?
[/Quote]

请参考13楼。
cuihaoyun 2010-02-06
  • 打赏
  • 举报
回复
模模糊糊心理有点数了 但是还是不清晰 能再详细点吗
耍宝王 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mstlq 的回复:]
这是一个很绕口的东西……
pascal语言里面,函数调用的默认压栈是方式是从左到右(加pascal调用关键字也是)……
如果要把pascal语言编出来的模块供其他语言调用,只能将函数声明为stdcall方式……

其他语言(C/C++)调用pascal的时候,默认它已经是stdcall约定了(因为原始的pascal模式C是没法用的),所以在微软看来,调用pascal的模块就要声明为stdcall,于是就将宏PASCAL定义成stdcall了……

[/Quote]
原来如此。Mark一下
traceless 2010-02-05
  • 打赏
  • 举报
回复
哈哈 这个问题搞这么长了呀。。。

我发现了几个有意思的表述。。。哈哈
mstlq 2010-02-05
  • 打赏
  • 举报
回复
我读本科时,delphi和c都开课,看到这个在两边表述不一致的pascal约定,也迷惑过一两天……
mstlq 2010-02-05
  • 打赏
  • 举报
回复
微软的PASCAL宏的意思不是“pascal的调用约定”,而是 “与pascal模块交互时使用的调用约定”
nevergone 2010-02-05
  • 打赏
  • 举报
回复
玩破解, 逆向分析的 比较懂这个:-)
mstlq 2010-02-05
  • 打赏
  • 举报
回复
这是一个很绕口的东西……
pascal语言里面,函数调用的默认压栈是方式是从左到右(加pascal调用关键字也是)……
如果要把pascal语言编出来的模块供其他语言调用,只能将函数声明为stdcall方式……

其他语言(C/C++)调用pascal的时候,默认它已经是stdcall约定了(因为原始的pascal模式C是没法用的),所以在微软看来,调用pascal的模块就要声明为stdcall,于是就将宏PASCAL定义成stdcall了……
jackyjkchen 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 nevergone 的回复:]
WINAPI 是__stdcall
PASCAL在windows编程里面, 只是WINAPI的一个别名.
Pascal语言的函数调用和__stdcall不一样.
[/Quote]
#define PASCAL __stdcall
彻底晕了……好好理一理……
nevergone 2010-02-05
  • 打赏
  • 举报
回复
WINAPI 是__stdcall
PASCAL在windows编程里面, 只是WINAPI的一个别名.
Pascal语言的函数调用和__stdcall不一样.
jackyjkchen 2010-02-05
  • 打赏
  • 举报
回复
看来我又断章取义了
mstlq 2010-02-05
  • 打赏
  • 举报
回复
__cdecl和__stdcall的压栈方式都是一样的(从右到左)
区别在于,__cdecl的压栈与退栈操作由调用者维护,__stdcall的压栈与退栈由函数本身维护……

pascal压栈是从左到右……

唉……
jackyjkchen 2010-02-05
  • 打赏
  • 举报
回复
“_stdcall是Pascal方式清理C方式压栈,通常用于Win32 Api中,函数采用从右到左的压栈方式”

除非维基和百度以及我的记忆全错了
jackyjkchen 2010-02-05
  • 打赏
  • 举报
回复
看来,某人完全分不清楚__cdecl和__stdcall
mstlq 2010-02-05
  • 打赏
  • 举报
回复
“无耻”……
WINAPI 是__stdcall
__stdcall 和 pascal的压栈方式相反……

楼主请自行google“函数调用约定”


编辑后的追加说明
-------------------
其实6楼的说法是正确的,当时我没看清他的描述就妄下结论了, 实在抱歉>_<
jackyjkchen 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 haha_ 的回复:]
见过无耻的 还没见过楼上这么无耻的

你第一次写的没错 在windows下 大写的PASCAL 就是_stdcall
pascal的参数压栈顺序跟stdcall正好相反,哪来的调用方式会一样。
[/Quote]
淡定,先看你自己说的话一会说PASCAL和__stdcall一样,一会说pascal压栈方式与_stdcall相反。

到底是谁无耻?
加载更多回复(6)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧