gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:48:39 27 4
gpt4 key购买 nike

直到现在,我从未真正需要我正在开发的大型 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com