无法使用SHGetFileInfo获取exe图标

时间:2016-05-21 12:16:45

标签: c++ winapi icons

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

的CMakeLists.txt:

add_executable(test test.cpp test.rc)

test.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"

TEST.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无法获取图标,代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

作为乔纳森波特的评论文章,这是由反斜杠造成的。在文件路径中将“/”更改为“\”后,代码可以正常工作。

答案 1 :(得分:1)

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

  

在调用SHGetFileInfo之前,必须使用CoInitialize或OleInitialize初始化组件对象模型(COM)。

因此,代码代码应改为:

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; // prints 0
  cout << sfi.hIcon << endl; // prints 0

  CoUninitialize();
}