特定のファイル拡張子から Windows シェルからアイコンを抽出する必要があります。抽出後、透明なPNGファイルとして保存する必要があります。
しかし、何が起こったのかわかりません。透明度が壊れているようです。
添付の画像をご覧ください(灰色が実際の透明度です)。
Windows シェルはこのアイコンを正しく表示しますが、一部のアーティファクト (影や輝きなど) も表示されます。以下のスクリーンショットを参照してください。
HRESULT hr = ::SHGetFileInfoA(pszPath, dwAttributes, &shfi, sizeof(shfi), SHGFI_SYSICONINDEX | SHGFI_LARGEICON );
if (!SUCCEEDED(hr))
return 0;
ATL::CComPtr<IImageList> pList;
HRESULT h2 = ::SHGetImageList(uState, IID_IImageList, (void**)&pList);
if (!SUCCEEDED(h2))
return 0;
int count = 0;
pList->GetImageCount(&count);
if (count <= shfi.iIcon)
return 0;
HICON ico = ImageList_GetIcon(IImageListToHIMAGELIST(pList), shfi.iIcon, ILD_TRANSPARENT);
Gdiplus::Bitmap bmp(ico);
Graphics *pGraphics = Graphics::FromImage(&bmp);
IMAGELISTDRAWPARAMS pimldp = {0};
pimldp.hdcDst = pGraphics->GetHDC();
pimldp.cbSize = sizeof IMAGELISTDRAWPARAMS;
pimldp.himl = IImageListToHIMAGELIST(pList);
pimldp.i = shfi.iIcon;
pimldp.x = 0;
pimldp.y = 0;
pimldp.cx = cx;
pimldp.cy = cy;
pimldp.yBitmap = 0;
pimldp.xBitmap = 0;
pimldp.fStyle = ILD_IMAGE | ILD_SCALE /*| ILD_PRESERVEALPHA*/ ;
ImageList_DrawIndirect(&pimldp);
CLSID clsid;
GetEncoderClsid(L"image/png", &clsid);
bmp.Save(L"d:\\test.png", &clsid);
::ShellExecuteA(NULL, "open", "d:\\test.png", "", "d:\\", SW_NORMAL);
pGraphics->ReleaseHDC(pimldp.hdcDst);
::DestroyIcon(ico);