この分野についてほとんど知識がないのですが、
自分なりにいろんなサイトのソースコードを切り貼りして完成させました。
実行させたところ部分的にしかうまく動きませんでした。
aaa.txtのアイコンを取得したときはdefault.icoは作成されました。
しかしなぜかアイコンファイルのサムネイル?は別の画像でした。
default.icoを開いてみるとずっと読み込み中になって開きません。
default.icoをデスクトップに貼り付けて、開いてみると
うまくいきました。aaa.txtのアイコンでした。
ちなみにaaa.txtのアイコンではなく
a.exeやフォルダaのアイコンを取得したときだと
デスクトップで開いてみても
元のアイコンと比べて色やデザインが違います。
原因をご教授ください。
よろしくお願いします。
#include <windows.h>
#include <atlbase.h>
void SaveIconToFile(HICON hico, LPCTSTR szFileName, BOOL bAutoDelete = FALSE)
{
PICTDESC pd = { sizeof(pd), PICTYPE_ICON };
pd.icon.hicon = hico;
CComPtr<IPicture> pPict = NULL;
CComPtr<IStream> pStrm = NULL;
LONG cbSize = 0;
BOOL res = FALSE;
res = SUCCEEDED(::CreateStreamOnHGlobal(NULL, TRUE, &pStrm));
res = SUCCEEDED(::OleCreatePictureIndirect(&pd, IID_IPicture, bAutoDelete, (void**)&pPict));
res = SUCCEEDED(pPict->SaveAsFile(pStrm, TRUE, &cbSize));
if (res)
{
// rewind stream to the beginning
LARGE_INTEGER li = { 0 };
pStrm->Seek(li, STREAM_SEEK_SET, NULL);
// write to file
HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (INVALID_HANDLE_VALUE != hFile)
{
DWORD dwWritten = 0, dwRead = 0, dwDone = 0;
BYTE buf[4096];
while (dwDone < cbSize)
{
if (SUCCEEDED(pStrm->Read(buf, sizeof(buf), &dwRead)))
{
::WriteFile(hFile, buf, dwRead, &dwWritten, NULL);
if (dwWritten != dwRead)
break;
dwDone += dwRead;
}
else
break;
}
_ASSERTE(dwDone == cbSize);
::CloseHandle(hFile);
}
}
}
HICON GetFileIcon(char *pszPathName)
{
SHFILEINFO shfi;
::SHGetFileInfo(pszPathName, 0, &shfi, sizeof(SHFILEINFO), SHGFI_ICON);
return shfi.hIcon;
}
int main()
{
HICON hico = //::LoadIcon(NULL, IDI_WARNING);
GetFileIcon("C:\\Users\\智義\\Desktop\\al_al");
SaveIconToFile(hico, TEXT("default.ico"), TRUE);
return 0;
}