马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
首先,在每一个MFC的应用程序中都有一个stdAfx.h,其中都有以下代码: #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT
|
现在我们要从中找出在的这五个头文件中,在哪个头文件中存在winmain。 那么我们怎么开始查找呢? 首先可以先到VC安装的目录下(默认为C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include)去找第一个头文件afxwin.h(为什么呢?因为此头文件中包含了MFC的核心和标准组件呀) 使用VC打开它,在其中我们可以找到: #ifndef __AFX_H__ #include <afx.h> #endif // Note: WINDOWS.H already included from AFXV_W32.H
|
从这么一段我们可以猜到,winmain函数多半是在WINDOWS.H文件中被包含进来的。而WINDOWS.H又是被afx.h通过AFXV_W32.H包含进来的。下面我们将验证这一猜想。 在AFXV_W32.h头文件中(同样地也在C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include目录下)我们可以找到:
这证实了// Note: WINDOWS.H already included from AFXV_W32.H这一说法。 下面要证实的是AFX.H又是如何包含到AFXV_W32.H的。 为了达到这一目标,我们可以在VC中选择的[Edit]/[Find in Files],在“Find in Files”对话框中指定查找“#include <afxv_w32.h>”,并将查找的目录设为“C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include”,查找的结果为在C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\Include\AFXVER_.H文件中有#include <afxv_w32.h>语句。因此下面我们要落实是不是AFX.H包含了AFXVER_.H。果然,我们可以在AFX.H中找到这样的语句: #include <afxver_.h> // Target version control。 WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd );
|
随后我们可以在windows.h中(在C:\Program Files\Microsoft Visual Studio\VC98\Include目录下)找到#include <winbase.h>语句,并在winbase.h中找到winmain函数的声明: 总结:原来MFC应用程序是这样诞生的: stdafx.h->afxwin.h->afx.h->afxver_.h->afxv_w32.h->windows.h->winbase.h->WinMain(); 关于WinMain函数的实现,我们可以在从以下内容得到提示: 1. C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\Include\TCHAR.H(431): #define _tWinMain WinMain 2. C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\APPMODUL.CPP(25): _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // call shared/exported WinMain return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } 3. C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\WINMAIN.CPP(21): int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { ASSERT(hPrevInstance == NULL); int nReturnCode = -1; CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetApp(); // AFX internal initialization if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow)) goto InitFailure; // App global initializations (rare) if (pApp != NULL && !pApp->InitApplication()) goto InitFailure; // Perform specific initializations if (!pThread->InitInstance()) { if (pThread->m_pMainWnd != NULL) { TRACE0("Warning: Destroying non-NULL m_pMainWnd\n"); pThread->m_pMainWnd->DestroyWindow(); } nReturnCode = pThread->ExitInstance(); goto InitFailure; } nReturnCode = pThread->Run(); InitFailure: #ifdef _DEBUG // Check for missing AfxLockTempMap calls 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; }
|