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

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日