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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
黒船
記事: 29
登録日時: 11年前
住所: 東京都目黒あたり

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

#1

投稿記事 by 黒船 » 10年前

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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 10年前

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

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

アバター
黒船
記事: 29
登録日時: 11年前
住所: 東京都目黒あたり

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

#3

投稿記事 by 黒船 » 10年前

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る