c++ - 使用 SHGetFileInfo 获取 exe 图标失败

标签 c++ winapi icons

我正在使用 cmake + nmake 构建 exe,我想从可执行文件本身获取图标句柄。

CMakeLists.txt:

add_executable(test test.cpp test.rc)

测试.rc:

IDI_ICON   ICON  DISCARDABLE  "test.ico"
IDI_ICON0   ICON  DISCARDABLE  "test.ico"
IDI_ICON1   ICON  DISCARDABLE  "test.ico"
IDI_ICON2   ICON  DISCARDABLE  "test.ico"

测试.cpp:

#include <windows.h>
#include <iostream>
using namespace std;

int main() {
    SHFILEINFO  sfi;
    memset(&sfi, 0, sizeof(sfi));
    DWORD_PTR ret = ::SHGetFileInfo("g:/workspace/test2/debug/test.exe",
                    0, &sfi, sizeof(sfi), SHGFI_LARGEICON|SHGFI_SMALLICON|SHGFI_ICON);
    cout << hex;
    cout << ret << endl; // prints 0
    cout << sfi.hIcon << endl; // prints 0
}

可执行文件g:/workspace/test2/debug/test.exe确实有图标,但是SHGetFileInfo获取图标失败,代码有什么问题?

最佳答案

我最好的选择是您(根据 documentation )需要在尝试提取图标信息之前调用 CoInitialize()。如果我们有一个无法处理正斜杠的 Windows 函数,我也不会感到惊讶:

You must initialize Component Object Model (COM) with CoInitialize or OleInitialize prior to calling SHGetFileInfo.

因此,代码代码更改为:

int main() {
  SHFILEINFO  sfi;

  // initialize COM library
  CoInitialize(NULL);
  memset(&sfi, 0, sizeof(sfi));
  DWORD_PTR ret = ::SHGetFileInfo("g:/workspace/test2/debug/test.exe",
                0, &sfi, sizeof(sfi), SHGFI_LARGEICON | SHGFI_ICON);
  cout << hex;
  cout << ret << endl;
  cout << sfi.hIcon << endl;

  CoUninitialize();
}

关于c++ - 使用 SHGetFileInfo 获取 exe 图标失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37362795/

相关文章:

windows - 在 Windows 中向 SCSI 设备发送特定的 SCSI 命令

html - 即使我正确路由字体图标也无法正确显示

css - WordPress - 稳定性主题 - 鼠标悬停时自定义图标颜色

c++ - 如何从基类的方法调用派生类的方法而不使其成为虚拟的?

c++ - 构建共享库时 -fPIC 是什么意思?

c++ - WinAPI - 无法点击按钮

c++ - Directx C++ - 绘制 DNA 形状

c++ - 无法移动集合迭代器

c++ - 虚函数如何工作以及分配时新返回类型会发生什么?

css - Angular JS 中搜索文本中的 Material 图标