使用WindowsShell獲取文件縮略圖

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章