请问下,ExitInstance(),什么时候使用的呢?


请问下,ExitInstance()一般是什么时候使用的呢?
我再看一个  做小化的时候,置于系统托盘的文章的时候,上面说:


还要注意在程序退出时删去图标 
int   App::ExitInstance()   

::Shell_NotifyIcon(NIM_DELETE,&nid); 
return   CWinApp::ExitInstance(); 



我就想问问,什么时候,什么情况下,需要调用 ExitInstance()呢?这个函数的作用是?
谢谢!

8 个解决方案

#1


程序退出~应该在app里可以找到这个函数~

#2


看看这里

int CWinThread::Run()
{
ASSERT_VALID(this);

// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;

// acquire and dispatch messages until a WM_QUIT message is received.
for (;;)
{
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}

// phase2: pump messages while available
do
{
// pump message, but quit on WM_QUIT
if (!PumpMessage())
return ExitInstance();

// reset "no idle" state after pumping "normal" message

if (IsIdleMessage(&m_msgCur))
{
bIdle = TRUE;
lIdleCount = 0;
}

} while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
}

ASSERT(FALSE);  // not reachable
}


ExitInstance就是在这里调用的

#3


当接收到WM_QUIT消息后就会ExitInstance

#4


这个。。。请问下,ExitInstance()是做啥子用的喃?!

#5


程序退出的时候调用,用来关闭一些句柄和释放DC用

#6


如果我不显示的调用,程序会不会自动调用呢?

#7


关于ExitInstance()函数的调用问题,需要了解一下MFC的执行流程。
我以建立一个名为Test的MFC工程(对于楼主所提的问题,是单文档还是多文档无所谓)为例,一切均采用默认设置,描述一下MFC程序何时调用ExitInstance()函数的。
1.你会看到CTestApp这个类,它继承自CWinApp,在CTestApp的构造函数下面,你会看到这样一条语句:CTextApp theApp;这是一个全局对象,一般书中都称它为应用程序对象,因为它是CWinApp的子类,CWinApp类中封装了一些与应用程序有关的方法。

2.全局对象的构造函数最先被执行,执行完毕后,才是主函数开始执行。执行CTestApp的构造函数,什么工作也不做,然后执行它的基类CWinApp的构造函数,为应用程序做一些准备工作,具体的细节看以查看MFC的源代码文件夹中的APPCORE.cpp文件中CWinApp的构造函数的实现。

3.执行到_tWinMain(见MFC的源代码文件夹中的APPMODUL.CPP)函数,它是MFC封装的主函数。_tWinMain中调用AfxWinMain函数。

4.AfxWinMain函数中。
4.1 调用AfxWinInit函数,主要工作有将_tWinMain传过来的四个参数赋值给CWinApp的四个相应的成员变量等,接着调用初始化线程的函数。
4.2 执行pApp->InitApplication(),pApp在CWinApp的构造函数中被赋值为this,也就是指向当前正在执行的CTestApp类的指针。但CTestApp类没有改写InitApplication(),所以调用它的基类CWinApp的InitApplication()。
4.3 执行pThread->InitInstance(),pThread在在CWinApp的构造函数中被赋值为this,于是调用CTestApp类的InitInstance()函数。
4.4 执行nReturnCode = pThread->Run()语句,进入消息循环。CTestApp没有改写Run函数,执行CWinApp::Run(),CWinApp::Run()中调用CWinThread::Run()。CWinThread::Run()的源代码2楼的shanwei355已经给出了源代码。
其中: if (!PumpMessage())
                return ExitInstance();
就是应用程序调用ExitInstance()的地方,此时它是被this调用的(如是其他的对象或类调用不能之单写一个函数名,要有其他信息.例如CWinApp::ExitInstance())。因此如果你在CTestApp中没有改写ExitInstance()函数,它会执行其默认实现。ExitInstance()会在应用程序发出WM_QUIT消息后,退出应用前被执行。2楼给出MFC源代码中的注释:// pump message, but quit on WM_QUIT一句说的就是它被调用的时机。WM_QUIT消息会在你单击程序窗口的关闭按钮,或在程序中主动调PostQuitMessage()函数时发出。

以上这些大多数与此问题无关的函数的功能我都没有详细说明,具体的你可以参考一下候俊杰的《深入浅出MFC》一书的第7章。我对MFC的了解也就算是个入门吧,可能说的也不是很明白,希望对你有些帮助。

#8


补充一下,既然ExitInstance()是在程序要退出时调用的,那么可以把它作为一种析构函数,做些清理工作,当然具体做什么由你自己决定。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: