void __fastcall Tform_Main::Button1Click(TObject *Sender) { //特定のファイルに関連づけられたアイコンを取り出す SHFILEINFO shfi; HICON hSmallIcon; TIcon *icoData; icoData = new TIcon; char WindowsPath[255], SystemPath[255]; GetWindowsDirectory(WindowsPath, sizeof(WindowsPath)); //ウィンドウズフォルダのパスを取得 //strcat(WindowsPath, "\\explorer.exe"); GetSystemDirectory(SystemPath, sizeof(SystemPath)); //システムフォルダのパスを取得 //strcat(SystemPath, "\\shell32.dll"); //スモールアイコンの取得 if(SHGetFileInfo(WindowsPath, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON ) != 0 ){ icoData->Handle = shfi.hIcon; } //取得したアイコンをイメージリストへ追加 imglst_Tree->AddIcon(icoData); //イメージリストの0番目の中身を表示 imglst_Tree->GetIcon(0, Image1->Picture->Icon); delete icoData; }
15行目付近の"SHGetFileInfo?"関数の引数を"SHGFI_SMALLICON"から"SHGFI_LARGEICON"に変えれば、大きいアイコンが取り出せます。
void __fastcall Tform_Main::Button1Click(TObject *Sender) { //特定のファイルに含まれているアイコンをとりだす int nIndex = 0; // 取得したいアイコンのインデックス HICON hLicon; // 大きいアイコン HICON hSicon; // 小さいアイコン ExtractIconEx( Application->ExeName.c_str(), nIndex, &hLicon, &hSicon, 1 ); // アイコン作成 TIcon *Ico = new TIcon(); Ico->Handle = hSicon; // 何らかの処理を記述 imglst_Tree->AddIcon( Ico ); //イメージリストの中身を表示 imglst_Tree->GetIcon(0, Image1->Picture->Icon); // 破棄 delete Ico; }
自分自身の実行ファイルに格納されているアイコンを取り出す例です。 8行目付近の"Application->ExeName?.c_str()"の所を変えれば、 任意のファイルからアイコンを取り出せます。 3行目付近の"nIndex"で、アイコンの番号を指定します。