HRESULT KThumbnailGetter::GetShellThumbnailImage(LPCWSTR pszPath, HBITMAP* pThumbnail)
{
HRESULT hr;
*pThumbnail = NULL;
LPITEMIDLIST pidlItems = NULL, pidlURL = NULL, pidlWorkDir;
WCHAR szBasePath[MAX_PATH], szFileName[MAX_PATH];
WCHAR* p;
wcscpy(szBasePath, pszPath);
p = wcsrchr(szBasePath, L'\\');
if (p) *(p + 1) = L'\0';
wcscpy(szFileName, pszPath + (p - szBasePath) + 1);
do
{
CComPtr<IShellFolder> psfDesktop;
hr = SHGetDesktopFolder(&psfDesktop);
if (FAILED(hr)) break;
CComPtr<IShellFolder> psfWorkDir;
DWORD dwAttribs = SFGAO_COMPRESSED;
ULONG cbEaten;
hr = psfDesktop->ParseDisplayName(NULL, NULL, szBasePath, &cbEaten, &pidlWorkDir, NULL);
if (FAILED(hr)) break;
hr = psfDesktop->BindToObject(pidlWorkDir, NULL, IID_IShellFolder, (LPVOID*)&psfWorkDir);
if (FAILED(hr)) break;
// 獲取文件的PIDL
hr = psfWorkDir->ParseDisplayName(NULL, NULL, szFileName, NULL, &pidlURL, NULL);
if (FAILED(hr)) break;
// 查詢縮略圖
CComPtr<IExtractImage> peiURL;
hr = psfWorkDir->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&pidlURL, IID_IExtractImage, NULL, (LPVOID*)&peiURL);
if (FAILED(hr)) break;
// 定義縮略圖屬性
SIZE size = { 256, 256 };
DWORD dwPriority = 0, dwFlags = IEIFLAG_ASPECT;
WCHAR pszImagePath[MAX_PATH];
hr = peiURL->GetLocation(pszImagePath, MAX_PATH, &dwPriority, &size, 16, &dwFlags);
if (FAILED(hr)) break;
// 提取縮略圖
hr = peiURL->Extract(pThumbnail);
if (FAILED(hr)) break;
break;
} while (0);
// 釋放資源
if (pidlWorkDir) CoTaskMemFree(pidlWorkDir);
if (pidlURL) CoTaskMemFree(pidlURL);
return hr;
}
使用WindowsShell獲取文件縮略圖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.