第一个Windows应用程序--启动函数、入口点函数与退出函数

来源:互联网 发布:amd显卡游戏优化 编辑:程序博客网 时间:2024/06/05 23:56

1.入口点函数

Windows 应用程序必须有一个入口点函数,应用程序开始运行时,这个函数会被调用。使用Win32 SDK开发程序的入口函数如下:

[cpp] view plain copy
 print?
  1. int WINAPI WinMain(  
  2.     HINSTANCE hInstanceExe,  
  3.     HINSTANCE,  
  4.     PTSTR pszCmdLine,  
  5.     int nCmdShow);  

1)hInstanceExe参数实际值是一个内存基地址;系统将可执行文件的映像加载到进程地址空间中的这个位置。例如,系统打开可执行文件,并将它的内容加载到地址0x00400000,则(w)WinMain的hInstanceExe参数值为0x00400000.

可执行文件的映像具体加载到哪一个基地址,是由链接器决定的。

2)第二个参数用于16位Windows系统,对32位系统都应传递NULL

3)pszCmdLine 是用来运行程序的命令行。有些Windows程序在启动时用它来把文件装入内存

4)nCmdShow 用来指明程序最初如何显示(正常显示、最大化到全屏、最小化到任务栏)


2.启动函数

操作系统实际上并不调用我们所写的入口点函数。相反,它会调用由C/C++运行库实现并在链接时使用-entry:命令行选项来设置的一个C/C++运行时启动函数。该函数将初始化C/C++运行库,使我们能调用malloc和free之类的函数。它还确保了在我们的代码开始执行之前,我们声明的任何全局和静态C++对象都被正确构造。


入口函数和启动函数:
WinMain --WinMainCRTStartup
wWinMain -- wWinMainCRTStartup
Main -- mainCRTStartup
Wmain --  wmainCRTStartup

其中开头的w表示Unicode版本。


在链接时,链接器将选择正确的C/C++运行库启动函数。链接器查找代码中包含四个入口函数中的哪一个,并嵌入相应的C/C++启动函数。
启动函数的用途:
1)获取指向新进程的完整命令行的一个指针
2)获取指向新进程的环境变量的一个指针
3)初始化C/C++运行库的全局变量
4)初始化C运行库内存分配函数(malloc和calloc)和其他底层I/O例程使用的堆(heap)
5)调用所有全局和静态C++对象的构造函数
完成所有这些初始化工作之后,C/C++启动函数就会调用应用程序的入口点函数。
例如写了一个_tWinMain函数,且定义了_UNICODE,其调用过程将如下所示:
[cpp] view plain copy
 print?
  1. GetStartupInfo(&StartupInfo);  
  2. int nMainRetVal = wWinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineUnicode,   
  3.     (StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ? StartupInfo.wShowWindow : SW_SHOWDEFAULT);  

_ImageBase是一个链接器定义的伪变量,表明可执行文件被映射到应用程序内存中的什么位置。


3.exit函数

入口点函数返回后,启动函数将调用C运行库函数exit,向其传递返回值nMainRetVal。
exit函数执行以下任务:
1)调用_onexit函数调用所注册的任何一个函数
2)调用所有全局和静态C++类对象的析构函数
3)在DEBUG生成中,如果设置了_CRTDUG_LEAK_CHECK_DF标志,就通过调用_CrtDumpMemoryLeak函数来生成内存泄露报告。

4)调用操作系统的ExitProcess函数,向其传入nMainRetVal。这会导致操作系统“杀死”我们的进程,并设置它的退出码。


4.最简单的windows程序代码示例

[cpp] view plain copy
 print?
  1. /* 
  2.  * HelloMsg.c -- Displays "Hello, Windows" in a message box 
  3.  * guzhoudiaoke@126.com 
  4.  * 2012-11-6 
  5.  */  
  6.   
  7. #include <Windows.h>  
  8.   
  9. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)  
  10. {  
  11.     MessageBox(NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);  
  12.   
  13.     return 0;  
  14. }  

5.运行结果

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝顾客给差评怎么办 淘宝买家账号体检违规怎么办 买家淘宝账户体检中心违规怎么办 淘宝卖家电话骚扰该怎么办 手机欠费销户了怎么办 想下载好多个淘宝怎么办 送快递不记得路怎么办 淘宝物流弄丢了怎么办 邮政快递碰上难缠客户怎么办 举证工伤对方不签收怎么办 快递员收件的钱怎么办 锐捷网卡是空的怎么办 mac系统excel太慢怎么办 二手车交易发票丢了怎么办 转转上买二手电脑被骗了怎么办 如果电脑买贵了怎么办 电脑配置低玩lol卡怎么办 电视打开显示无信号怎么办 电脑卡怎么办换个驱动 刚开始开淘宝店没人买怎么办 公司有人带自己电脑办公怎么办 组装电脑连不上网怎么办 显卡玩不起吃鸡怎么办 u盘内存是假的怎么办 新买的电脑应该怎么办 海尔一体机电脑开不开机怎么办 苹果笔记本系统坏了怎么办 苹果笔记本电脑电池坏了怎么办 苹果笔记本电脑屏幕坏了怎么办 平板开关键坏了怎么办 平板电脑电池坏了怎么办 平板电脑充电口坏了怎么办 平板电脑系统坏了怎么办 平板电脑充电器坏了怎么办 平板电脑触摸屏坏了怎么办 平板电脑关不了机怎么办 平板电脑触摸屏没反应怎么办 平板电脑声音太小怎么办 平板电脑频碎了怎么办? 淘宝直播展示频道排后怎么办 网店头像改不了怎么办