鱼C论坛

 找回密码
 立即注册
查看: 2484|回复: 1

[技术交流] MFC应用程序之生

[复制链接]
发表于 2013-5-19 12:20:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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目录下)我们可以找到:
#include <windows.h>


这证实了// 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;
}



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-19 12:23:35 | 显示全部楼层
激动人心,无法言表!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 04:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表