VC++——应用程序执行机制之WinMain函数

2023-11-22 22:58

本文主要是介绍VC++——应用程序执行机制之WinMain函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小编要和大家分享的是WinMain函数,在DOS下,程序的执行是从main函数开始的。在Windows下,对应的函数是WinMain。但是,如果浏览Hello程序的所有的方法和全局函数,是找不到WinMain函数的。MFC考虑到典型的Windows程序需要的大部分初始化工作都是标准化的,因此把WinMain函数隐藏在应用程序的框架中,编译时会自动将该函数链接到可执行文件中。程序员可以重写WinMain函数,但一般不需要这么做。


  下面的程序给出了WinMain函数的代码。其中,_tWinMain函数在\DevStudio\Vc\Mfc\src\AppModul.cpp中定义,它所调用的AfxWinMain函数在同一目录下的WinMain.cpp中定义。名字是_tWinMain函数而不是WinMain,是考虑到对不同字符集的支持,在tchar.h中有_tWinMain的宏定义。在ANSI字符集下编译时,_tWinMain就变成WinMain,在Unicode下编译时,_tWinMain就变成wWinMain


 


提示:Unicode是具有固定宽度、统一的文本和字符的编码标准。由于Unicode采用的是16位编码,因此可以包含世界各地的书写系统的字符和技术符号(如中文也在Unicode之中),从而克服了ASCII码在表示多语言文本上的不足之处,扩大了ASCII7位编码方案的好处。Unicode同等地对待所有的字符,并且在表示各种语言的任何字符时既不需要换码序列(escape)也不需要控制代码。Win32Visual C++很好的支持Unicode字符集。


 


_tWinMain函数定义


 


extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,


 


LPTSTR lpCmdLine, int nCmdShow);


 


#ifdef _MAC


 


extern "C" int PASCAL


 


#else


 


extern "C" int WINAPI


 


#endif


 


_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,


 


LPTSTR lpCmdLine, int nCmdShow)


 


{


 


return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);


 


}


 


 


AfxWinMain函数定义:


 


int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,


 


LPTSTR lpCmdLine, int nCmdShow)


 


{


 


ASSERT(hPrevInstance == NULL);


 


int nReturnCode = -1;


 


CWinApp* pApp = AfxGetApp();


 


if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))


 


goto InitFailure;


 


ASSERT_VALID(pApp);


 


if (!pApp->InitApplication())


 


goto InitFailure;


 


ASSERT_VALID(pApp);


 


 


if (!pApp->InitInstance())


 


{


 


if (pApp->m_pMainWnd != NULL)


 


{


 


TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");


 


pApp->m_pMainWnd->DestroyWindow();


 


}


 


nReturnCode = pApp->ExitInstance();


 


goto InitFailure;


 


}


 


ASSERT_VALID(pApp);


 


nReturnCode = pApp->Run();


 


ASSERT_VALID(pApp);


 


InitFailure:


 


#ifdef _DEBUG


 


if (AfxGetModuleThreadState()->m_nTempMapLock != 0)


 


{


 


TRACE1("Warning: Temp map lock count non-zero (%ld).\n",


 


AfxGetModuleThreadState()->m_nTempMapLock);


 


}


 


AfxLockTempMaps();


 


AfxUnlockTempMaps(-1);


 


#endif


 


 


 


AfxWinTerm();


 


return nReturnCode;


 


}


 


  应用程序执行时,Windows自动调用应用程序框架内部的WinMain函数。WinMain函数会查找该应用程序的一个全局构造对象,这个对象是由CWinApp派生类构造的,有且只有一个。它是一个全局对象,因此在程序启动时,它就已经被构造好了。


  随后,WinMain将调用这个对象的InitApplicationInitInstance成员函数,完成应用程序实例的初


始化工作。随后,WinMain调用Run成员函数,运行应用程序的消息循环。在程序结束时,WinMain调用AfxWinTerm函数,做一些清理工作。


转载请注明出处:  程序员之家 http://www.sunxin.org/

这篇关于VC++——应用程序执行机制之WinMain函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413511

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.