获取任意文件的缩略图

原文链接: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来取得文件图标:

 

   SHFILEINFO sfi;
   SHGetFileInfo(szFile, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON);
   nImage = m_imglist.AddIcon(sfi.hIcon);

   DestroyIcon(sfi.hIcon);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值