MFC应用程序中未调用ExistInstance

MFC应用程序中未调用ExistInstance,mfc,exit,Mfc,Exit,直到现在,我才真正需要我正在开发的大型MFC(单文档界面,如果有关系)应用程序的Winapp ExistInstance()。但是现在我做了,主要是清理内存地址,卸载一些DLL,等等。我很快就从明显的内存泄漏中了解到,ExistInstance没有被调用。我错过了什么明显的东西吗?我是否需要手动向消息映射添加一些内容以确保调用我的ExistInstance override 我想我可以在其他地方清理,但如果我能让它运行的话,那是最好的地方。有趣的是,我通过在Google中键入“ExistInst

直到现在,我才真正需要我正在开发的大型MFC(单文档界面,如果有关系)应用程序的Winapp ExistInstance()。但是现在我做了,主要是清理内存地址,卸载一些DLL,等等。我很快就从明显的内存泄漏中了解到,ExistInstance没有被调用。我错过了什么明显的东西吗?我是否需要手动向消息映射添加一些内容以确保调用我的ExistInstance override


我想我可以在其他地方清理,但如果我能让它运行的话,那是最好的地方。有趣的是,我通过在Google中键入“ExistInstance never called”之类的字符串发现了很多这样的例子,但在任何情况下都没有提供任何真正的答案。当有人单击“文件”菜单中的“关闭”框或“退出”时,应用程序通常会关闭,而且大型机窗口的OnClose()肯定会被调用。我甚至尝试通过放置AfxGetMainWnd()->DestroyWindow()来强制执行操作;在那个mainframe OnClose()事件中,但我仍然无法让existInstance()实际运行。也许这只是一个大的虚拟函数?或者我只是个大傻瓜?:-)

我和你有一个类似的问题……我的问题是由Unicode和MBCS构建代码的混合引起的……也许这就是你的根本原因

我必须将MBCS应用程序转换为Unicode,但不可能转换整个项目,因此我必须混合使用Unicode编译(应用程序)和MBCS编译代码(DLL)

一些MBCS DLL为MFC扩展DLL,其他为常规DLL

其中一个MFC扩展DLL包含资源(位图图像列表和公共对话框)

我没有将DLL转换为UNICODE,因为它有很多依赖DLL,这些DLL也必须转换,此外,我不需要公共对话框中的控件来支持UNICODE文本

因此,我将DLL保留为MBCS,并在使用MBCS DLL中任何使用资源的类之前使用AfxSetResourceHandle……这是为了使资源直接从DLL中提取,而不是通过MFC资源链,因为MFC无法找到非unicode资源

我猜MFC不喜欢混合使用包含资源的Unicode和非Unicode编译代码……资源链中的查找失败(我猜这与资源ID转换为ID字符串有关,即通过MAKEINTRESOURCE)

我做了主应用Unicode,并确保MBCS DLL中的类的C++头在函数原型中使用CStringA,或者接受宽字符串,并在内部进行转换。 我发现我的应用程序无法正确退出…它将停留在MFC CWinThread::PumpMessage/AfxInternalPumpMessage()调用中,并且永远不会调用ExistInstance

为了解决这个问题,在我的CMainFrame::OnDestroy()中,我将以下语句作为最后两条语句:

void CMainFrame::OnDestroy() 
{
    ....

    CFrameWnd::OnDestroy();

    AfxPostQuitMessage(0);
}

我也有同样的问题。事实证明,这是由于大型机被破坏后,CWinApp对象对某些消息进行了预翻译造成的。在处理过程中,它会遇到一些有效的检查,只是退出,而不是通过正常的退出

覆盖应用程序预翻译消息并在没有主框架时立即返回解决了问题

BOOL CYourAppClass::PreTranslateMessage( MSG* pMsg )
{
    // If the main window has gone away there is no need to do pre-translation.
    // If the pre-translation were allowed to proceed the
    //  CWinAppEx::PreTranslateMessage may bail out without calling
    /// the app's ExitInstance nor destructing the app object.
    if ( !m_pMainWnd )
        return FALSE;

return CWinAppEx::PreTranslateMessage( pMsg );
}

您说“大型机窗口的OnClose()肯定总是被调用”。我的一个MFC应用程序出现问题;我在窗口的OnClose()事件处理程序中放入了一些线程清理代码,但没有调用它。在经历了一些痛苦之后,我将线程清理代码放入OnDestroy()事件处理程序中,现在它总是被调用。因此,您可能需要检查OnClose()事件处理程序是否总是被调用。

我遇到了完全相同的问题

在我的例子中,通过覆盖
CMainFrame
中的
PostNcDestroy
解决了这个问题。似乎在主框架窗口中处理这最后一条消息可以让一切正常工作:

virtual void PostNcDestroy();

void CMainFrame::PostNcDestroy()
{
}

另一种可能是,在关闭过程中间出现断言失败。例如,在销毁窗口时。 我发现当这种情况发生时,
ExitInstance
也会被跳过

因此,在关闭应用程序之前,请清除“输出/调试日志”窗口,并查看是否打印了此类消息。
如果是这种情况,请解决该问题,并查看是否再次调用
ExitInstance

如果您的应用程序是从CWinApp派生的,则应始终调用ExitInstance。如果没有,可能是声明不正确,或者您的应用程序由于某种原因提前终止。我知道应该终止,但事实并非如此,即使没有运行、没有点击、没有错误,并且应用程序以代码0关闭。维尔德。我需要在消息映射中添加一些内容吗?如果我的existInstance()覆盖也是虚拟的(应该不重要),这有关系吗。我是否需要将soemthing添加到消息映射中以确保其被调用?“如果我的existInstance()覆盖也是虚拟的(应该不重要),这很重要。”这无关紧要,因为被覆盖的虚拟函数始终是虚拟的,无论您是否将其标记为虚拟的。