第一个Windows应用程序--启动函数、入口点函数与退出函数
来源:互联网 发布:windows字体下载 编辑:程序博客网 时间:2024/06/03 19:12
1.入口点函数
Windows 应用程序必须有一个入口点函数,应用程序开始运行时,这个函数会被调用。使用Win32 SDK开发程序的入口函数如下:
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版本。
启动函数的用途:
1)获取指向新进程的完整命令行的一个指针
2)获取指向新进程的环境变量的一个指针
3)初始化C/C++运行库的全局变量
4)初始化C运行库内存分配函数(malloc和calloc)和其他底层I/O例程使用的堆(heap)
5)调用所有全局和静态C++对象的构造函数
完成所有这些初始化工作之后,C/C++启动函数就会调用应用程序的入口点函数。
例如写了一个_tWinMain函数,且定义了_UNICODE,其调用过程将如下所示:
_ImageBase是一个链接器定义的伪变量,表明可执行文件被映射到应用程序内存中的什么位置。
3.exit函数
入口点函数返回后,启动函数将调用C运行库函数exit,向其传递返回值nMainRetVal。exit函数执行以下任务:
1)调用_onexit函数调用所注册的任何一个函数
2)调用所有全局和静态C++类对象的析构函数
3)在DEBUG生成中,如果设置了_CRTDUG_LEAK_CHECK_DF标志,就通过调用_CrtDumpMemoryLeak函数来生成内存泄露报告。
4)调用操作系统的ExitProcess函数,向其传入nMainRetVal。这会导致操作系统“杀死”我们的进程,并设置它的退出码。
4.最简单的windows程序代码示例
5.运行结果
阅读全文
0 0
- 第一个Windows应用程序--启动函数、入口点函数与退出函数
- 第一个Windows应用程序--启动函数、入口点函数与退出函数
- 第一个Windows应用程序--启动函数、入口点函数与退出函数
- Windows应用程序入口函数编写
- 1-2 Windows下启动函数(真正的入口函数) 之 寻找入口函数与_security_init_cookie
- Windows应用程序启动函数
- Windows 应用程序的入口函数编写
- Windows上编程的入口点函数
- 关于入口点函数
- windows程序入口函数
- windows入口函数
- Windows下程序入口函数与_security_init_cookie
- DLL入口点函数DllMain
- C++程序入口点函数
- 修改函数入口点(转)
- DLL入口点函数DllMain .
- VB 函数入口点选择
- DLL入口点函数DllMain
- java类加载
- linux 0.11内存管理
- Sublime Text3 使用教程
- android studio生成aar包并在其他工程引用aar包
- 框架、类库整理
- 第一个Windows应用程序--启动函数、入口点函数与退出函数
- cookie机制
- apue<<UNIX环境高级编程>>翻译错误罗列
- notepad++行首行尾添加字符
- java自学---如何寻找好书?
- Linux C++的多线程编程
- SDUVJ开发实录(七):rank、contest_rank及其他
- Redis的快照与AOF
- Unity 实现背景图片淡入淡出