Windows零基础入门:1.8 Win32与控制台程序入口函数对比

4317 人浏览 | 时间: 2015-07-31 11:56:49 | 作者: codexia 会员文章,禁止转载

    下面给出Win32标准的入口函数的写法,如下图:

Win32标准的入口函数的写法,注释windows.h包含
    图中出现了波浪线,光标放在带有波浪线的文字上面,提示错误信息。其他的参数,都成了清一色的白色。说明参数都有问题,因为VS无法识别参数的类型等。

    这里需要学习VS的一些提示,可以帮助你快速知道你的代码的情况。
    波浪线:语法错误提示。一般语法错误,都会提示波浪线。当你的光标放在波浪线的文字上时,会显示错误提示。通常看这些提示,可以帮你快速找到问题。遇到这样的错误时,第一件事是去查看错误信息,从错误信息中寻找答案。这是必须学会的本领,而不是截个图去问。你需要自己试图去找到答案,实在找不到,问别人的时候,要给出错误提示信息,让别人告诉你。
    颜色:VS中的不同的颜色表示了不同的关键词和类别等。比如说,数据类型一种颜色,变量名一种颜色,函数名一种颜色,宏一种颜色,等等,当然还有更多的分类。而如果你发现这些颜色显示不正常,可以初步判断你的代码有些不正常。当然,也可能是VS本身的问题。反正,你需要确认这个是不是有问题。上图的函数里面的参数都变白了,说明是不正常的。而看提示说<error-type>,错误的类型。表示VS无法认识HINSTANCE这种数据类型,因此导致错误。像这种问题,一般都是缺少头文件,或者你的类型声明不在使用的地方的前面部分。因为C/C++语法规则中,需要使用前先声明,同样适用于数据类型定义。
    我们去掉头文件的注释,此时就是正常的入口函数了。你可以在入口函数里面开始写代码了。看到这个函数,是不是发现和C语言的main函数差不多呢?只不过它多了几个你暂时还不认识的数据类型罢了。函数前面多了一个WINAPI而已。
    不过C语言中的入口函数main,我们实际上了解的并不多。只是大家用习惯了也没有去想什么。下面我再跟大家先说说main函数,然后再对比一下WinMain函数。
    作为我们打交道做频繁的函数就是入口函数,我们有必要仔细学习一下。我们一定要了解的比较深入,才会有兴趣。我们不是应试,一切都以学到本领为根本,让自己提高能力为标准。
    通常我们简单的写C/C++语言的入口函数,如下:
void main()
{
}
     那么这样的形式,是不是已经简单的不能再简单了呢?是的。但是这里忽略了大量的信息,而这些信息我们需要好好学习。当然,我们这里只是大概的对比一下控制台和win32程序两个程序类型的入口函数。具体的入口函数解释,将在第二章解释。当然,第一章的这个部分,必须掌握。对比控制台程序和win32程序入口函数之后,你会发现,其实是一样的模式。后面只解释win32的,你可以自己类推到控制台的。
    入口函数是一个程序的主进程的主线程所在的函数,也就表示说,这个入口函数是主线程所执行的地方。控制台程序是单进程单线程的,这样,main函数的生死周期就代表了这个程序的生死周期。那么,作为标准的写法,建议main函数提供一个int的返回值。这个返回值的作用就是程序的退出码。退出码表示一个程序的运行结束状态。如果正常结束程序,一般返回0最为程序的退出码。表示程序自然死亡。如果程序中途运行崩溃而死亡,一般在程序内部会有比如exit(-1)这种函数,会终止程序的执行。这个终止实际上是终止了主线程。进程线程简单来说,就是代表运行的一个程序。如果要执行多个功能,就让这个程序分身,产生多个线程。详细请学习《计算机操作系统》,汤子瀛的。后面必要时再专题讲解一下。
    简单来说,就是程序出车祸一样的,非正常死亡。另外还有一种情况就是被其他进程或者系统进程强行杀死,也是属于非正常死亡。这时候退出码要设置一个数值作为标志。那么我们就可以通过这个程序退出码来分辨程序结束的状态,是正常结束还是非正常结束。
    举个例子来说,我们在卫士软件里批量安装软件,或者批量卸载软件时,或者在安装驱动时,通过第三方软件如金山卫士,驱动精灵等,他们在完成一个软件的安装或者卸载时,安装的那个程序如果正常完成会返回一个正常结束的退出码,然后第三方软件就知道,达到了效果,表示安装成功。如果安装中途失败,返回的退出码表示失败的状态。就是这样,就让退出码很有意义。
    而通常我们直接启动一个程序,退出码就返回给了系统,如果程序崩溃了,系统一般会提示是否关闭程序之类的提示,这也是系统从程序的返回码得知程序的结束状态,从而可以善后处理。所以,建议大家的返回值用int就是这个道理。
    而入口函数的参数,则是用于接收命令行参数之类的,添加了参数的入口函数版本,你可以对命令行进行处理。对于命令行的更多了解,参考文章《应用程序如何传递参数(命令行)以及如何测试命令行
    所以,完整的main函数的写法是:
int main(int argc,char **argv)
{
}
     而对于入口函数的参数的解释,将在后续章节讲解。都这里,是不是感觉main和WinMain有点像了呢?实际上,入口函数的功能几乎一样,所以,只是形式不一样罢了。入口函数的参数,表现的形式不一样,完成的功能基本一样,只是根据程序类型,有各自的特点。比如说WinMain函数是Win32程序的入口,那么它需要一个参数表示启动程序时窗口显示的大小,比如最大化,最小化、普通等,而控制台程序不存在这个特性,自然也就没有这个参数。而基本的命令行信息参数都具备,后面再详细分析。
    还有一个就是入口函数名和返回类型之间,WinMain函数多了一个WINAPI,看起来挺奇怪的。这个在Windows程序中很基本很常见的。这表示的是函数的调用方式,具体来说就是指入口函数被调用时参数的处理方式。我们这里只是对比了解一下,后面详细分析。在此你只要知道,这个标志表示的是调用函数的方式而已。main函数似乎没有,其实也是有的。只是默认的形式,所以不需要写而已。它的调用约定为__cdecl,这是C/C++ 缺省调用方式。__cdecl 是C Declaration的缩写,意思为C 声明的意思。
    我们自己加上去,那么main函数就是这样的:
int __cdecl main(int argc,char **argv)
{
}
     此时我们再来对比WinMain函数,是不是基本就一样了呢。或者说,我们把WinMain前面的WINAPI去掉,它会提示警告,但是也是能够运行的。因为它也会用默认的方式来调用。
    不过,WinMain函数不能省掉参数。所以不能像main一样写到最简化。不过这个无所谓,况且参数里面有我们非常重要的信息。
    到此,对比控制台程序入口函数和Win32入口函数的结果就是,其实都是差不多的,只是根据程序类型不同,形式有不同罢了,基本的还是一样。而调用方式指的是运行时库调用入口函数的方式。调用约定放在哪个函数前,就表示这个函数被调用的时候要用这个方式被调用。相信本节课学完,你不仅是对控制台入口函数还是Win32入口函数,都有一个整体的了解和把我,对这些陌生的东西不会是恐惧,反而是更多的兴趣。后面的课程将为你揭开这些有意思的东西。
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

Win32课程菜单