我正在使用 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/