【发布时间】: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 资源:指定的图像文件没有 不包含资源部分。
所以我的问题:
- 如何修复丢失的应用图标?
- 为什么 GetLastError 返回 0?我怎样才能找到底层发生的事情?
【问题讨论】:
-
您的图标资源的尺寸是多少?
SM_CXICON和SM_CYICON的值是什么(使用GetSystemMetrics()function 查找这些值)? -
@AdrianMole 图标的尺寸是128*128,SM_CXICON和SM_CYICON都是48。我尝试用默认的MFC图标替换我的图标,但没有成功。
-
嗯。注意from the docs:LoadIcon 只能加载大小符合 SM_CXICON 和 SM_CYICON 系统指标值的图标。(而 MFC 的
CWinApp::LoadIcon只是包装了通用的 WinAPI 函数。) -
@AdrianMole 很有趣,1)它一直在 32 位配置下工作,2)当我用默认的 MFC 图标(24*24)替换它时它不起作用。
-
您确定您的资源已链接到可执行文件中吗?