我只是想知道,如果在Windows中从字节数组(缓冲区)加载HICON
的API?假设我下载了一个*.ico
文件,并且我在某个缓冲区中包含了这个文件的内容。我希望能够从该缓冲区创建HICON
。从缓冲区(* .ico文件)加载HICON
可以从*.ico
加载HICON
放置在硬盘上,所以我想应该有一个同样简单的方法来从内存缓冲区中做到这一点?
到目前为止,我只找到2个解决方案,但没有一个适合我。
第一个involved ATL usage and GDI+(我正在使用Rust,我没有任何与GDI +的绑定)。
第二个是基于使用LookupIconIdFromDirectoryEx()
和CreateIconFromResourceEx()
。首先,我拨打LookupIconIdFromDirectoryEx()
来获取正确图标的偏移量,然后尝试呼叫CreateIconFromResourceEx()
(和CreateIconFromResource()
)获取HICON,但在所有情况下,我都收到NULL
值,因此GetLastError()
返回0
。我对这些函数的使用是基于this article(我试图通过不仅0
作为第二个参数,但也是数组缓冲区的大小,不包括偏移量,但它仍然失败)。
我唯一想到的解决方案是手动解析*.ico
文件,然后从中提取PNG图像,然后使用描述的方法here从PNG图像创建一个图标。但它似乎更像是一种解决方法(尽管Qt使用类似的方法,也许他们无法找到不同的解决方案)。有没有更简单的方法(可能是一些WinAPI调用)来完成任务?
UPD。下面是我尝试过的一些测试代码(为了运行没有崩溃的例子,你应该有一个图标)。
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
#pragma comment(lib, "User32.lib")
int main()
{
// Read the icon into the memory
FILE* f = fopen("icon.ico", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);
char* data = (char*)malloc(fsize + 1);
fread(data, fsize, 1, f);
fclose(f);
static const int icon_size = 32;
int offset = LookupIconIdFromDirectoryEx((PBYTE)data, TRUE, icon_size, icon_size, LR_DEFAULTCOLOR);
if (offset != 0) {
HICON hicon = CreateIconFromResourceEx((PBYTE)data + offset, 0, TRUE, 0x30000, icon_size, icon_size, LR_DEFAULTCOLOR);
if (hicon != NULL) {
printf("SUCCESS");
return 0;
}
}
printf("FAIL %d", GetLastError());
return 1;
}
看起来您的代码中存在一个错误。除非你提供[mcve],否则我们无法帮助你。 – IInspectable
修复你的代码而不是放弃 –
@IInspectable,我没有在最初添加它,因为它基本上与我链接的文章中的相同。但是现在我更新了描述并附上源代码。在我的情况下,它总是打印“失败0”。 – ScienceSE