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

相关文章

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(