【问题标题】:MFC dialog could not load IDR_MAINFRAME correctlyMFC 对话框无法正确加载 IDR_MAINFRAME
【发布时间】:2021-12-28 15:34:01
【问题描述】:

我的项目(基于对话框)以前配置为 32 位。现在我将其配置为 64 位应用程序。 但是主对话框和关于对话框中都缺少该应用程序。

调试时,我可以在主对话框的构造函数中看到 m_hIcon 在此行之后为 NULL:

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

我尝试调用 GetLastError,但它返回 0。我什至尝试过:

m_hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
auto lastError = GetLastError();

不幸的是,lastError 也是 0。

应用使用WinSparkle,VC2019的输出窗口显示:

Microsoft C++ 异常:winsparkle::Win32Exception 在内存位置 0x000000800836E408。 WinSparkle:可执行文件没有所需的 VERSIONINFO 资源:指定的图像文件不包含 资源部分。在 0x00007FF9F0204F99 处抛出异常 XXXX.exe:Microsoft C++ 异常:winsparkle::Win32Exception at 内存位置 0x000000800836DF18。 WinSparkle:可执行文件没有 具有所需的 VERSIONINFO 资源:指定的图像文件没有 不包含资源部分。

所以我的问题:

  1. 如何修复丢失的应用图标?
  2. 为什么 GetLastError 返回 0?我怎样才能找到底层发生的事情?

【问题讨论】:

  • 您的图标资源的尺寸是多少? SM_CXICONSM_CYICON 的值是什么(使用 GetSystemMetrics() function 查找这些值)?
  • @AdrianMole 图标的尺寸是128*128,SM_CXICON和SM_CYICON都是48。我尝试用默认的MFC图标替换我的图标,但没有成功。
  • 嗯。注意from the docsLoadIcon 只能加载大小符合 SM_CXICON 和 SM_CYICON 系统指标值的图标。(而 MFC 的 CWinApp::LoadIcon 只是包装了通用的 WinAPI 函数。)
  • @AdrianMole 很有趣,1)它一直在 32 位配置下工作,2)当我用默认的 MFC 图标(24*24)替换它时它不起作用。
  • 您确定您的资源已链接到可执行文件中吗?

标签: winapi mfc


【解决方案1】:

如果有人遇到同样的问题,我的应用程序会在 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 之前尝试修改 PEB 本身,这会导致 LoadIcon 无法正常工作。它适用于 win32 配置,但不适用于 x64 配置。

LoadIcon调用后移动PEB修改逻辑后,主对话框现在有图标,并且托盘图标也可以显示在Windows任务栏上。但是,AboutDialog 上的图标仍然无法正确显示,因为它是每次动态创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多