原文链接:http://blog.sina.com.cn/s/blog_465c136b010008to.html
HRESULT GetShellThumbnailImage(LPCWSTR pszPath, HBITMAP* pThumbnail)
{
HRESULT hr;
*pThumbnail = NULL;
LPITEMIDLIST pidlItems = NULL, pidlURL = NULL, pidlWorkDir = NULL;
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);
while (TRUE)
{
CComPtr<IShellFolder> psfDesktop;
hr = SHGetDesktopFolder(&psfDesktop);
if (FAILED(hr)) break;
CComPtr<IShellFolder> psfWorkDir;
hr = psfDesktop->ParseDisplayName(NULL, NULL, szBasePath, NULL, &pidlWorkDir, NULL);
if (FAILED(hr)) break;
hr = psfDesktop->BindToObject(pidlWorkDir, NULL, IID_IShellFolder, (LPVOID*) &psfWorkDir);
if (FAILED(hr)) break;
hr = psfWorkDir->ParseDisplayName(NULL, NULL, szFileName, NULL, &pidlURL, NULL);
if (FAILED(hr)) break;
// query IExtractImage
CComPtr<IExtractImage> peiURL;
hr = psfWorkDir->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*) &pidlURL, IID_IExtractImage, NULL, (LPVOID*) &peiURL);
if (FAILED(hr)) break;
// define thumbnail properties
SIZE size = { 64, 48 };
DWORD dwPriority = 0, dwFlags = IEIFLAG_ASPECT;
WCHAR pszImagePath[MAX_PATH];
hr = peiURL->GetLocation(pszImagePath, MAX_PATH, &dwPriority, &size, 16, &dwFlags);
if (FAILED(hr)) break;
// generate thumbnail
hr = peiURL->Extract(pThumbnail);
if (FAILED(hr)) break;
break;
}
// free allocated structures
if (pidlWorkDir) CoTaskMemFree(pidlWorkDir);
if (pidlURL) CoTaskMemFree(pidlURL);
return hr;
}
注意此函数有可能失败,这时还应该用SHGetFileInfo来取得文件图标: