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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-12-26   浏览: 584 ::
收藏到网摘: 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函数,做一些清理工作。