Windows零基础入门:2.1 指定入口点函数名为自定义函数名

4197 人浏览 | 时间: 2015-08-05 22:40:27 | 作者: codexia
    在第一章中,我们已经对很多疑问做了解答。基本上,解答了常见的各种疑问。也讲到了程序入口的背景知识,比较了控制台和win32程序入口。基本上,就结束了第一章的解惑。
    我们开始第二章的内容,也是我们Windows编程的知识的正式开始。如果你对于前面的解惑不清楚,务必先看完解惑部分。如果有什么疑惑,不清楚Windows编程怎么一回事,请看解惑里有没有,如果没有,请向我提问,我补充。如果有,就不要重复问了。如果解惑教程文章里没有说清楚,可以继续问。
    那么Windows程序,通常也叫作win32程序。为什么这个问题,在前面讲过了,不多说。只要是个程序,总会要启动,要被操作系统启动来运行。你可以记得,不是你启动了你的程序,而是操作系统启动执行的。你只是告诉了系统而已。系统就来调用你的程序,就找你的程序的入口。所以,基本上,所有的程序都有一个入口函数。控制台程序,win32程序,都一样。而且入口函数都颇为相似,只是不同类型的程序底层支持库不一样,所以有些不同。但是基本的流程都一样。控制台程序是main,win32就是WinMain了。
    那么我们开始正式写第一个Win32程序了。是不是有点激动呢?那就让我们开始写吧。
    首先,我们要写好入口函数结构。下面这样:
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,PSTR szCmdLine,int iCmdShow)
{
    return 0;
}

    在《Windows零基础入门:1.8 Win32与控制台程序入口函数对比》里,我们对此作了一些介绍。我们接着深入了解。我不直接全部一股脑加上所有的东西,而已一步步的加,让你更容易懂,不会增加理解负担。
    在上述代码中,就是一个完整的Win32程序了。不要觉得奇怪,事实上它就是win32程序。只是它什么也没做,就直接退出了。返回给系统的退出码是0,表示正常退出。不过这个退出码你可以填任意一个。这里没有规定必须是0.只是一般默认0是正常退出,大家都是一个默认约定而已。否则,你做的很奇葩,返回-1作为正常退出标志,而别人运行你程序,以为是异常退出,还在那里检查到底哪里出了问题,这不是把别人坑了嘛。
    只要你返回的是一个整数int类型的值,都可以。这个前面的文章也讲过,不多说了。
    这个程序代码也会生产正确的exe程序,只是这个程序,运行后,什么也看不到就退出了。你眼睛快的话,或许在任务管理器可以瞄见一眼。然而这个没有什么意义,不用费心。我们下面来介绍有意义的东西。那就是这些参数和包含的头文件了。
    对于入口函数,是WinMain,你可能会很容易理解,因为控制台的叫做main,那么Win32程序叫做WinMain不就表示的是Windows程序的main函数嘛。这样也就快速理解了WinMain函数名的由来。事实上,这个只是默认的罢了,这个函数名只是一个象征名字罢了,你可以修改的。不过改这些没有太大的意义。这里只是告诉你,可以这么做,不让你的思维局限于这个函数名真的只能固定为这个名字。
    学编程,可能你开始学的时候,肯定不知道,但是思维一定要发散。其他的课程就中规中矩的告诉你怎么样怎么样,而我们的课程会结合实际的开发经验和个人的总结升华,在入门时告诉你,让你从一开始就知道可以这样,而不是学习到一定程度后,才恍然大悟,还可以这样!C++技术网的课程,可以学到这些东西,真正内在的东西。
    你可以写如下代码,即可实现修改入口点函数名,可以不用WinMain。
#pragma comment(linker, "/entry:testMain") 
#include <windows.h>
int WINAPI testMain(HINSTANCE hInstance,HINSTANCE hPrev,PSTR szCmdLine,int iCmdShow)
{
    return 0;
}

    #pragma这一句是预编译指令,相当于在VS的项目属性里设置一样的效果。这个预编译指令设置的是linker,linker就是链接器的意思,entry就是入口的意思,表示的入口点函数名。后面的testMain就是函数名。你可以改成任意的函数名,然后WinMain这个名字就失效了,你定义的这个才是真正的入口点函数了。这一句预编译指令的意思就是修改了入口点函数的名称而已。
    我们可以在VS的项目设置里设置。先打开项目的cpp文件,然后依次选择设置VS菜单的“项目”-->“属性”--> "属性页"-->"配置属性"-->"链接器(linker)"-->"高级"-->"入口点",在这个入口点项中输入自定义的入口点函数名即可。这样你就不用写WinMain了,直接写你定义的这个函数名作为入口函数即可。
    本节课就介绍这些,下节课演示如何创建一个Win32程序项目。如果你现在想试着做一下,可以先自己创建一下项目,看看效果。
请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制

Win32课程菜单