?? chap3_4.htm
字號:
<html>
<head>
<title>3.4 應(yīng)用程序執(zhí)行機(jī)制</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">電腦報(bào)Visual
C++網(wǎng)絡(luò)教程</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">應(yīng)用程序執(zhí)行機(jī)制</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函數(shù)</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 在DOS下,程序的執(zhí)行是從main函數(shù)開始的。在Windows下,對應(yīng)的函數(shù)是WinMain。但是,如果瀏覽Hello程序的所有的方法和全局函數(shù),是找不到WinMain函數(shù)的。MFC考慮到典型的Windows程序需要的大部分初始化工作都是標(biāo)準(zhǔn)化的,因此把WinMain函數(shù)隱藏在應(yīng)用程序的框架中,編譯時(shí)會(huì)自動(dòng)將該函數(shù)鏈接到可執(zhí)行文件中。程序員可以重寫WinMain函數(shù),但一般不需要這么做。<br>
下面的程序清單3-1給出了WinMain函數(shù)的代碼。其中,_tWinMain函數(shù)在\DevStudio\Vc\Mfc\src\AppModul.cpp中定義,它所調(diào)用的AfxWinMain函數(shù)在同一目錄下的WinMain.cpp中定義。名字是_tWinMain函數(shù)而不是WinMain,是考慮到對不同字符集的支持,在tchar.h中有_tWinMain的宏定義。在ANSI字符集下編譯時(shí),_tWinMain就變成WinMain,在Unicode下編譯時(shí),_tWinMain就變成wWinMain。</span></p>
<b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">提示</b>:Unicode是具有固定寬度、統(tǒng)一的文本和字符的編碼標(biāo)準(zhǔn)。由于Unicode采用的是16位編碼,因此可以包含世界各地的書寫系統(tǒng)的字符和技術(shù)符號(如中文也在Unicode之中),從而克服了ASCII碼在表示多語言文本上的不足之處,擴(kuò)大了ASCII碼7位編碼方案的好處。Unicode同等地對待所有的字符,并且在表示各種語言的任何字符時(shí)既不需要換碼序列(escape)也不需要控制代碼。Win32和Visual
C++很好的支持Unicode字符集。</span></p>
<b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">清單3-1 _tWinMain函數(shù)定義</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函數(shù)定義:</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>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -