我只是想知道,如果在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