MFC如何封装WINDOWS应用程序的流程
2012-06-10 07:52
218 查看
MFC如何封装WINDOWS应用程序的流程
作者:陆麟
转载请征得作者同意.
2000.11.27
MFC封装了WIN API.大家都知道.但是MFC应用程序的真正流程又有多少人知道呢?
下面就是我对MFC启动代码的一些剖析.
在TCHAR.H里,有这么2小段define.通过我的简化,我们可以看到:
//TCHAR.H
#ifdef _UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif
由于为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版.对UNICODE版的程序,C运行库将调用wWinMain,而对于ANSI版的应用,则调用WinMain.这是第一点.
然后,其实MFC的代码设计时是自动支持UNICODE的,所以,MFC的WinMain在APPMODUL.CPP被定义为
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
这样以一来,无论用户#define _UNICODE与否,MFC的WinMain都会被调用.接下来,_tWinMain的实际运作如下:
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
这样,AfxWinMain就和MFC挂上了钩.甚至在PETER NORTON的书中,都仅讲到了AfxWinMain乃是MFC的WinMain,但是,NORTON同志看来没有讲述清楚这点.因为,WinMain仍然是WinMain,C运行库并没有因为MFC的存在而重新设计AfxWinMain的入口.
在MS的AfxWinMain(WINMAIN.CPP)里我们可以看到如下代码:
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;
}
以上代码将整个庞大的MFC架构完全启动起来.如果要了解其Afx大头的函数群,大家可以对以看一下MFC源代码里的*CORE.CPP.
真正的难点到是到TCHAR.H中找到WinMain的别名吧.因为几乎没人会想到TCHAR.H居然隐藏了如此大的MFC机要啊...
现在,MFC的启动流程就完全清楚了吧...:)
作者:陆麟
转载请征得作者同意.
2000.11.27
MFC封装了WIN API.大家都知道.但是MFC应用程序的真正流程又有多少人知道呢?
下面就是我对MFC启动代码的一些剖析.
在TCHAR.H里,有这么2小段define.通过我的简化,我们可以看到:
//TCHAR.H
#ifdef _UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif
由于为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版.对UNICODE版的程序,C运行库将调用wWinMain,而对于ANSI版的应用,则调用WinMain.这是第一点.
然后,其实MFC的代码设计时是自动支持UNICODE的,所以,MFC的WinMain在APPMODUL.CPP被定义为
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
这样以一来,无论用户#define _UNICODE与否,MFC的WinMain都会被调用.接下来,_tWinMain的实际运作如下:
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
这样,AfxWinMain就和MFC挂上了钩.甚至在PETER NORTON的书中,都仅讲到了AfxWinMain乃是MFC的WinMain,但是,NORTON同志看来没有讲述清楚这点.因为,WinMain仍然是WinMain,C运行库并没有因为MFC的存在而重新设计AfxWinMain的入口.
在MS的AfxWinMain(WINMAIN.CPP)里我们可以看到如下代码:
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;
}
以上代码将整个庞大的MFC架构完全启动起来.如果要了解其Afx大头的函数群,大家可以对以看一下MFC源代码里的*CORE.CPP.
真正的难点到是到TCHAR.H中找到WinMain的别名吧.因为几乎没人会想到TCHAR.H居然隐藏了如此大的MFC机要啊...
现在,MFC的启动流程就完全清楚了吧...:)
相关文章推荐
- MFC如何封装WINDOWS应用程序的流程
- 如何在Windows应用程序中实现电子注册功能
- MFC对话框应用程序 如何在对话框窗口显示前获取窗口(控件)的屏幕坐标位置
- 如何使用 Sqldumper.exe 为 Windows 应用程序生成转储文件
- windows应用程序如何实现图片上传
- 如何向预先存在的 MFC 应用程序添加 OLE 拖放功能
- Windows 任务管理器如何确定应用程序"没有响应"
- MFC学习笔记之:Windows如何区分鼠标双击和两次单击
- windows下的vs2017新建win32控制台应用程序项目如何调出程序向导选项?
- 如何:调试 Windows 服务应用程序
- 如何为 MFC 应用程序创建本地化资源 DLL
- MFC Windows应用程序的基本运行机制与HelloWin程序详细解
- Windows下如何解放右Ctrl+Space给应用程序使用
- VS2010如何在控制台应用程序中添加对MFC库的支持
- MFC如何在有界面的应用程序中开启控制台窗口
- 如何在Windows下编译SQLite Java封装
- MFC 应用程序框架-程序入口和执行流程
- 如何让WIN32应用程序支持MFC类库
- 如何查找安装的 Java 版本(而不在 Windows 或 Mac 中运行小应用程序)?
- MFC应用程序运行流程