当前位置: 首页 > 图文教程 > 开发语言 > VC++ > VC++:应用程序执行机制之WinMain函数

VC++
使用免费界面换肤软件 USkin
Cell插件在J2EE系统中的应用
采用MFC编制MVC模式之球体演示程序
托管资源全攻略
使用 MFC 编写打印程序
根据所选择的 TrueType 字体生成点阵数据
让你的软件界面更漂亮(四):不完美之菜单
VC界面的实现
让你的软件界面更漂亮(三)
分割窗口后如何限制分割条的移动范围
关于 CFileDialog 对话框多选功能的一个问题
让你的软件界面更漂亮(二)
对话框模板,RegexTest
让你的软件界面更漂亮(一)
利用窗口子类化隐藏系统图标
KVIP考勤系统
类似于FlashGet的悬浮框的制作
计算MDI子窗口数,仅显示文件夹的打开对话框
智能ABC窗口的实现
在打开文件对话框上实现图象预览

VC++:应用程序执行机制之WinMain函数


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-12-26   浏览: 594 ::
收藏到网摘: n/a

  下面的程序给出了WinMain函数的代码。其中,_tWinMain函数在\DevStudio\Vc\Mfc\src\AppModul.cpp中定义,它所调用的AfxWinMain函数在同一目录下的WinMain.cpp中定义。名字是_tWinMain函数而不是WinMain,是考虑到对不同字符集的支持,在tchar.h中有_tWinMain的宏定义。在ANSI字符集下编译时,_tWinMain就变成WinMain,在Unicode下编译时,_tWinMain就变成wWinMain

 

提示:Unicode是具有固定宽度、统一的文本和字符的编码标准。由于Unicode采用的是16位编码,因此可以包含世界各地的书写系统的字符和技术符号(如中文也在Unicode之中),从而克服了ASCII码在表示多语言文本上的不足之处,扩大了ASCII7位编码方案的好处。Unicode同等地对待所有的字符,并且在表示各种语言的任何字符时既不需要换码序列(escape)也不需要控制代码。Win32Visual C++很好的支持Unicode字符集。

 

_tWinMain函数定义

 

extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

 

LPTSTR lpCmdLine, int nCmdShow);

 

#ifdef _MAC

 

extern "C" int PASCAL

 

#else

 

extern "C" int WINAPI

 

#endif

 

_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

 

LPTSTR lpCmdLine, int nCmdShow)

 

{

 

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

 

}

 

 

AfxWinMain函数定义:

 

int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

 

LPTSTR lpCmdLine, int nCmdShow)

 

{

 

ASSERT(hPrevInstance == NULL);

 

int nReturnCode = -1;

 

CWinApp* pApp = AfxGetApp();

 

if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))

 

goto InitFailure;

 

ASSERT_VALID(pApp);

 

if (!pApp->InitApplication())

 

goto InitFailure;

 

ASSERT_VALID(pApp);

 

 

if (!pApp->InitInstance())

 

{

 

if (pApp->m_pMainWnd != NULL)

 

{

 

TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");

 

pApp->m_pMainWnd->DestroyWindow();

 

}

 

nReturnCode = pApp->ExitInstance();

 

goto InitFailure;

 

}

 

ASSERT_VALID(pApp);

 

nReturnCode = pApp->Run();

 

ASSERT_VALID(pApp);

 

InitFailure:

 

#ifdef _DEBUG

 

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;

 

}

 

  应用程序执行时,Windows自动调用应用程序框架内部的WinMain函数。WinMain函数会查找该应用程序的一个全局构造对象,这个对象是由CWinApp派生类构造的,有且只有一个。它是一个全局对象,因此在程序启动时,它就已经被构造好了。

  随后,WinMain将调用这个对象的InitApplicationInitInstance成员函数,完成应用程序实例的初

始化工作。随后,WinMain调用Run成员函数,运行应用程序的消息循环。在程序结束时,WinMain调用AfxWinTerm函数,做一些清理工作。