ページ 11

フォルダのアイコンを取得するプログラムについて

Posted: 2014年6月01日(日) 20:28
by 黒船
フォルダやリンクファイルのアイコンを取得するプログラムを作っています。
この分野についてほとんど知識がないのですが、
自分なりにいろんなサイトのソースコードを切り貼りして完成させました。
実行させたところ部分的にしかうまく動きませんでした。

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;
}

Re: フォルダのアイコンを取得するプログラムについて

Posted: 2014年6月03日(火) 21:44
by h2so5
黒船 さんが書きました: aaa.txtのアイコンを取得したときはdefault.icoは作成されました。
しかしなぜかアイコンファイルのサムネイル?は別の画像でした。
それはサムネイルのキャッシュの影響なのでそれほど問題ではないと思います。
黒船 さんが書きました: デスクトップで開いてみても
元のアイコンと比べて色やデザインが違います。
IPicture::SaveAsFile関数では半透明のアイコンを正常に書き出せないようです。

下のサイトで解決法が説明されていますが、結構面倒くさいですね...
http://stackoverflow.com/questions/2289 ... n-ico-file

Re: フォルダのアイコンを取得するプログラムについて

Posted: 2014年6月07日(土) 01:04
by 黒船
返信が遅くなりました。
h2so5 さん
ありがとうございます。
urlにあったソースを実行してみましたが
うまく結果を得られませんでした。
(私の環境で実行できないものもありました。)
ファイルのアイコンは取得できたのですが
フォルダのアイコンはダメでした。

ほかに方法を思いついた方が
いましたらご教授お願いします。

ちなみに言語は問いません。