Я пытаюсь получить иконку высокого разрешения или миниатюру в Windows, учитывая полный путь к этому файлу. Не нужно быть миниатюрами - хорошо выглядящая икона будет великолепной. Мне все равно, если это HICON или HBITMAP: я собираюсь поместить его в объект GDI + и отобразить его в контексте устройства.
Я пробовал использовать SHGetFileInfo (с различными вариантами флажков), но никогда не получаю больше, чем значок 32x32, который ужасно масштабируется до 128 пикселей или так, что мне нужно.
if (!SHGetFileInfoW(path, 0, &fi, sizeof(fi),
SHGFI_ICON | SHGFI_ICONLARGE | SHGFI_TYPENAME))
return GetLastError();
// fi.hIcon is a valid icon here, but it horrible quality with
// a black mask on it. I want higher quality, and dare I dream of
// alpha channel? Mask is acceptable, i suppose.
SHGetFileInfo возвращает "" при вызове SHGFI_ICONLOCATION (который, как представляется, является известной проблемой с этим API).
Я также пытался использовать SHCreateItemFromParsingName имя с целью получить IThumbnailProvider, но BindToHandler всегда возвращает E_NOTIMPL для BHID_ThumbnailHandler...
IShellItem *psi;
hr = SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
IThumbnailProvider *pThumbProvider;
hr = psi->BindToHandler(NULL, BHID_ThumbnailHandler,
IID_PPV_ARGS(&pThumbProvider));
if (SUCCEEDED(hr))
{
// never get here because hr == E_NOTIMPL !!!
Я действительно запускаю Microsoft Пример поставщиков эскизов и обнаружил, что он страдает от той же проблемы с BindToInterface.
Итак, какие-либо предложения о том, что еще я мог попробовать? Мне просто нужно что-то изображение, которое более или менее представляет этот файл, скажем, размером не менее 100 пикселей - всего-то лучше, чем 32x32...