mfc - MFC 应用程序中未调用 ExitInstance

标签 mfc exit

直到现在,我从未真正需要我正在开发的大型 MFC(如果重要,则为单文档界面)应用程序的 Winapp ExitInstance()。但现在我这样做了,主要是为了清理内存分配、卸载一些 DLL 等。好吧,我很快就从明显的内存泄漏中了解到,ExitInstance 没有被调用。我错过了一些明显的东西吗?我是否需要向消息映射手动添加一些内容以确保调用我的 ExitInstance 覆盖?

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

最佳答案

我遇到了与您类似的问题...我的问题是由混合 Unicode 和 MBCS 构建代码引起的...也许这是您的根本原因?

我不得不将一个 MBCS 应用程序转换为 Unicode,但不可能转换整个项目,所以我不得不混合使用 Unicode 编译代码(应用程序)和 MBCS 编译代码(DLL)。

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

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

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

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

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

我将主应用程序设为 UNICODE,并确保 MBCS DLL 中类的 C++ header 在函数原型(prototype)中使用 CStringA,或接受宽字符串并在内部进行转换。

我发现我的应用程序无法正常退出...它将停留在 MFC CWinThread::PumpMessage/AfxInternalPumpMessage() 调用中,并且永远不会调用 ExitInstance。

为了解决它,在我的 CMainFrame::OnDestroy() 中,我将以下内容作为最后 2 个语句:

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

    CFrameWnd::OnDestroy();

    AfxPostQuitMessage(0);
}

关于mfc - MFC 应用程序中未调用 ExitInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3186965/

相关文章:

c++ - MFC中如何指定默认选中的Radiobutton?

c++ - 如何获取SysTreeView32滚动条的句柄?

c++ - 如何检查其他程序是否以全屏模式运行,例如。媒体播放器

java - liquibase 创建数据库后不开始测试

vb.net - 退出尝试与退出子

c++ - 安装 msi 后无法显示 png 并在我的应用程序的某些代码部分发出警告

c++ - 使用 cURL 时 MFC 无模式对话框卡住

gdb - 让 gdb 在断点处退出

python - 在 systemctl 停止服务时正确退出 python 脚本

c - wait() 和 exit() 调用的错误输出