📄 chap3_4.htm
字号:
<html>
<head>
<title>3.4 应用程序执行机制</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="85%" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0"
cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><a
href="../../vc.htm"><span style="text-decoration: none"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></span></a></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="4"><b><p ALIGN="CENTER"></b></font><font
color="#3973DE" FACE="Times New Roman" SIZE="4">3.4 </font><font SIZE="4" color="#3973DE">应用程序执行机制</font><font
FACE="Times New Roman" SIZE="3"></p>
<b><p ALIGN="JUSTIFY"></b></font><span style="font-size: 9pt"><font color="#3973DE">3.4.1
WinMain函数</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 在DOS下,程序的执行是从main函数开始的。在Windows下,对应的函数是WinMain。但是,如果浏览Hello程序的所有的方法和全局函数,是找不到WinMain函数的。MFC考虑到典型的Windows程序需要的大部分初始化工作都是标准化的,因此把WinMain函数隐藏在应用程序的框架中,编译时会自动将该函数链接到可执行文件中。程序员可以重写WinMain函数,但一般不需要这么做。<br>
下面的程序清单3-1给出了WinMain函数的代码。其中,_tWinMain函数在\DevStudio\Vc\Mfc\src\AppModul.cpp中定义,它所调用的AfxWinMain函数在同一目录下的WinMain.cpp中定义。名字是_tWinMain函数而不是WinMain,是考虑到对不同字符集的支持,在tchar.h中有_tWinMain的宏定义。在ANSI字符集下编译时,_tWinMain就变成WinMain,在Unicode下编译时,_tWinMain就变成wWinMain。</span></p>
<b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">提示</b>:Unicode是具有固定宽度、统一的文本和字符的编码标准。由于Unicode采用的是16位编码,因此可以包含世界各地的书写系统的字符和技术符号(如中文也在Unicode之中),从而克服了ASCII码在表示多语言文本上的不足之处,扩大了ASCII码7位编码方案的好处。Unicode同等地对待所有的字符,并且在表示各种语言的任何字符时既不需要换码序列(escape)也不需要控制代码。Win32和Visual
C++很好的支持Unicode字符集。</span></p>
<b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">清单3-1 _tWinMain函数定义</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// export WinMain to force linkage to this
module</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">extern int AFXAPI AfxWinMain(HINSTANCE
hInstance, HINSTANCE hPrevInstance,</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">LPTSTR lpCmdLine, int nCmdShow);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#ifdef _MAC</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">extern "C" int PASCAL</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#else</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">extern "C" int WINAPI</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#endif</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">_tWinMain(HINSTANCE hInstance, HINSTANCE
hPrevInstance,</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">LPTSTR lpCmdLine, int nCmdShow)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// call shared/exported WinMain</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">return AfxWinMain(hInstance,
hPrevInstance, lpCmdLine, nCmdShow);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxWinMain函数定义:</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">/////////////////////////////////////////////////////////////////////////////</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Standard WinMain implementation</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Can be replaced as long as 'AfxWinInit'
is called first</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">int AFXAPI AfxWinMain (HINSTANCE
hInstance, HINSTANCE hPrevInstance,</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">LPTSTR lpCmdLine, int nCmdShow)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ASSERT(hPrevInstance == NULL);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">int nReturnCode = -1;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CWinApp* pApp = AfxGetApp();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// AFX internal initialization</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!AfxWinInit(hInstance, hPrevInstance,
lpCmdLine, nCmdShow))</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">goto InitFailure;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// App global initializations (rare)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ASSERT_VALID(pApp);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!pApp->InitApplication())</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">goto InitFailure;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ASSERT_VALID(pApp);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Perform specific initializations</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!pApp->InitInstance())</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (pApp->m_pMainWnd != NULL)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">TRACE0("Warning: Destroying non-NULL
m_pMainWnd\n");</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">pApp->m_pMainWnd->DestroyWindow();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">nReturnCode = pApp->ExitInstance();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">goto InitFailure;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ASSERT_VALID(pApp);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">nReturnCode = pApp->Run();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ASSERT_VALID(pApp);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">InitFailure:</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#ifdef _DEBUG</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Check for missing AfxLockTempMap calls</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">if
(AfxGetModuleThreadState()->m_nTempMapLock != 0)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">TRACE1("Warning: Temp map lock count
non-zero (%ld).\n",</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxGetModuleThreadState()->m_nTempMapLock);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxLockTempMaps();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxUnlockTempMaps(-1);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#endif</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -