gpt4 book ai didi

c++ - 如何将 HICON 保存为 .ico 文件?

转载 作者:可可西里 更新时间:2023-11-01 12:42:43 25 4
gpt4 key购买 nike

我正在从 .exe/.dll 中提取一个图标,并想将其保存在一个 .ico 文件中。执行此操作的最佳方法是什么?

我尝试使用 ::OleCreatePictureIndirect(),然后使用 IPicture->SaveAsFile()。它可以工作,但图标的透明部分被涂成黑色(显然不再透明 :( ))。

我试过手动解析。它工作正常但很麻烦,我担心 Vista 图标/.icl 文件/等的复杂性。

请帮忙。谢谢。

最佳答案

您可以使用 IPicture::SaveAsFile() 方法保存 HICON。这是一个使用它的示例 C++ 程序:

#include "stdafx.h"
#include <windows.h>
#include <olectl.h>
#pragma comment(lib, "oleaut32.lib")

HRESULT SaveIcon(HICON hIcon, const wchar_t* path) {
// Create the IPicture intrface
PICTDESC desc = { sizeof(PICTDESC) };
desc.picType = PICTYPE_ICON;
desc.icon.hicon = hIcon;
IPicture* pPicture = 0;
HRESULT hr = OleCreatePictureIndirect(&desc, IID_IPicture, FALSE, (void**)&pPicture);
if (FAILED(hr)) return hr;

// Create a stream and save the image
IStream* pStream = 0;
CreateStreamOnHGlobal(0, TRUE, &pStream);
LONG cbSize = 0;
hr = pPicture->SaveAsFile(pStream, TRUE, &cbSize);

// Write the stream content to the file
if (!FAILED(hr)) {
HGLOBAL hBuf = 0;
GetHGlobalFromStream(pStream, &hBuf);
void* buffer = GlobalLock(hBuf);
HANDLE hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if (!hFile) hr = HRESULT_FROM_WIN32(GetLastError());
else {
DWORD written = 0;
WriteFile(hFile, buffer, cbSize, &written, 0);
CloseHandle(hFile);
}
GlobalUnlock(buffer);
}
// Cleanup
pStream->Release();
pPicture->Release();
return hr;

}
int _tmain(int argc, _TCHAR* argv[])
{
HICON hIcon = (HICON)LoadImage(0, L"c:\\windows\\system32\\perfcentercpl.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
if (!hIcon) return GetLastError();
HRESULT hr = SaveIcon(hIcon, L"c:\\temp\\test.ico");
return hr;
}

关于c++ - 如何将 HICON 保存为 .ico 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2289894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com