为了账号安全,请及时绑定邮箱和手机立即绑定

请问一下关于VC++的Winmain函数(WINAPI是什么?)

请问一下关于VC++的Winmain函数(WINAPI是什么?)

C++
皈依舞 2019-09-20 19:14:30
关于VC++的Winmain函数(WINAPI是什么?)查看完整描述
查看完整描述

6 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

如果你创建工程时选择Win32 Application,然后选择A Simple Win32 Application,在主cpp里面就可以看到WinMain()函数

查看完整回答
反对 回复 2019-09-22
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

WinMain()函数等价于控制台程序中的main()函数。

该函数是执行开始的地方,也是为程序其余部分执行基本初始化工作的地方。

为了允许Windows传递数据,WinMain()函数有4个形参和一个int类型的返回值,其原型如下:

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow

);

返回类型说明符int的后面,有一个函数说明符WINAPI。WINAPI是一个Windows定义的宏,将使系统以特定于Windows
API函数的某种特殊方式处理函数名和实参。这种方式与C++通常处理函数的方式不同。具体的细节是不重要的——这只不过是Windows所要求的方式而
已,因此只需要将WINAPI宏名称放在由Windows调用的函数名前面即可。

如果确实想要了解调用约定,就查看随Visual
C++提供的文档,文档中有对调用约定的描述。WINAPI定义为__stdcall,将此修饰符置于函数名之前表明使用的是标准Windows调用约
定。这要求参数以相反的顺序被推入栈,被调用函数结束时清除栈。本章稍后将看到的CALLBACK修饰符也定义为__stdcall,因此与WINAPI
是等价的。标准C++调用约定由__cdecl修饰符指定。

Windows传递给WinMain()函数的4个参数包含着重要的数据:

hInstance属于HINSTANCE类型,是指向某个实例的句柄——
这里的实例是正在运行的程序。句柄是标识某种对象(这里是应用程序的实例)的整数值。句柄的实际整数值是多少并不重要。在任何给定时刻都可能有好几个程序
在Windows下执行,这就使相同应用程序可能有若干副本同时在活动,而这种情形需要识别出来。因此,hInstance句柄标识某个特定的副本。如果
启动某个程序的多个副本,则每个副本都有自己独特的hInstance值。正如我们很快就将看到的那样,句柄还用来标识各种其他事物。

hPrevInstance是从16位版本的Windows操作系统继承下来的,我们可以放心地对它置之不理。在当前版本的Windows中,该参数始终为空。

lpCmdLine是指向某个字符串的指针,该字符串包含启动程序的命令行字符。该指针允许挑出可能在命令行中出现的任何参数值。LPSTR类型是
另一种Windows类型,用来指定32位(long)的字符串指针,或者当以64位模式编译时,则用来指定64位的字符串指针。WinMain()的另
一个版本接收LPWSTR,用于使用Unicode。

nCmdShow决定着被创建窗口的外观。窗口可以正常显示,也可以最小化显示;例如,程序的快捷方式可能指定该程序在启动时应该最小化显示。该参
数可以是一组固定值之一,这些值是由像SW_SHOWNORMAL和SW_SHOWMINNOACTIVE这样的一些符号常量定义的。此类定义窗口显示方
式的常量还有9个,它们都以SW_开始。通常不需要检查nCmdShow的值,而是直接将其传递给负责显示应用程序窗口的Windows API函数

程序中的WinMain()函数需要做以下4件事情:

告诉Windows该程序需要的窗口种类

创建程序窗口

初始化程序窗口

检索属于该程序的Windows消息





查看完整回答
反对 回复 2019-09-22
?
开满天机

TA贡献1786条经验 获得超12个赞

是一个宏
#define WINAPI __stdcall

具体来说,他们是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?

stdcall的调用约定意味着:

1)参数从右向左压入堆栈;
2)函数自身修改堆栈;
3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。


查看完整回答
反对 回复 2019-09-22
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。


查看完整回答
反对 回复 2019-09-22
?
HUH函数

TA贡献1836条经验 获得超4个赞

winmain是windows系统应用程序的入口,他是应用程序进程的主线程,要创建一个进程,并且在windows环境下运行必须用winmain作为入口,而且必须是windows定义的格式写。。。。
而main()作为程序入口,有的运行环境用有的运行环境不用,控制台程序用main,虚拟机程序,比如c#就用main()。。。。。
有些应用软件winmain函数被封装了,改用main()函数,但他外层有winmain,winmain是windows唯一识别的应用程序入口,哪怕你用的是main,但归结的底层入口还是winmain,比如虚拟机表面上用main,但他和系统交互还是用的winmain创建入口。。。。
winmain只要能使用windowsAPI的软件都支持,但用main就未必了。


查看完整回答
反对 回复 2019-09-22
  • 6 回答
  • 0 关注
  • 457 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信