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