void CTestDlg::OnBnClickedButton3()
{
AfxGetMainWnd()->SendMessage(WM_CLOSE);
DeleteFile(_T("d:\\test.txt"));
}
为什么程序退出后还能执行DeleteFile呢?

解决方案 »

  1.   

    那是个关系消息,你发送那个消息后不代表马上程序的实体就被销毁了,所以有一段时间来执行下面的语句。再一个,这个删除语句不依赖你的程序的主体的,但WM_CLOSE是关闭你的主体程序。
      

  2.   

    WM_CLOSE实际上是调用了CDialog::OnClose()这个和OnCancel()原理是一样的,因为都是内部调用EndDialog(),而实际上并非直接结束程序,而是在经过一段时间之后才会销毁,所以接下来的语句也会被执行到。
      

  3.   

    WM_CLOSE并不是关闭消息,发完了这个消息后,系统会将它交由DefWindowProc处理,后者关闭窗口,然后发送WM_DESTROY消息,系统在处理WM_DESTROY时会发出WM_QUIT消息,此时,消息循环才会退出,你的程序才会退出,所以从调用SendMessage到关闭中间还有很长的时间。
      

  4.   

    PostQuitMessage(0);这样的话可能就没有机会了~没试过,推测而已:)
      

  5.   

    SendMessage是致使你的close完成
    但是只是发出了WM_DESTROY
    而且即使真的已经关闭了窗口,只要对象还没有完全析构就可以执行API啊
      

  6.   

    通过SendMessage发送相关的消息是需要等待接收线程处理完该消息之后才返回的,LZ可能认为主线程接收到WM_CLOSE之后并处理完成之后才返回,因此不会执行后面的DeleteFile,这种理解对于一般的消息是正确的,但是对于WM_CLOSE就不正确的,接收线程的确是先处理完WM_CLOSE消息之后才返回的,不过接收线程在处理WM_CLOSE消息的时候不是直接关闭整个程序,而是通过PostQuitMessage(或者PostMessage)再向主线程发送退出的消息,PostQuitMessage的处理方法跟SendMessage有一个明显的不同就是不需要等待接收线程处理完成之后才返回,而是发送完成之后就直接返回,而不管接收线程处理消息的结果怎么样了,因此当发出SendMessage(WM_CLOSE)之后,主线程不会马上退出、而发送线程还会接着继续执行后续的代码就是这个原因了
      

  7.   

    谢谢楼上各位。也就是说DeleteFile得以执行是因为从发出WM_CLOSE到程序退出有“很长”时间?如果发出WM_CLOSE后又有非常长的代码,可能会出现无法执行完的情况?