IShellLibrary::ResolveFolder 方法 (shobjidl_core.h)

解析库文件夹的目标位置,即使文件夹已被移动或重命名。

语法

HRESULT ResolveFolder(
  [in]  IShellItem *psiFolderToResolve,
  [in]  DWORD      dwTimeout,
  [in]  REFIID     riid,
  [out] void       **ppv
);

参数

[in] psiFolderToResolve

类型: IShellItem*

表示要查找的库文件夹的 IShellItem 对象。

[in] dwTimeout

类型:DWORD

方法将在返回之前尝试查找文件夹的最长时间(以毫秒为单位)。 如果在指定的时间过去之前找不到文件夹,则返回错误。

[in] riid

类型: REFIID

对接口的 IID 的引用,用于获取 ppv ,表示已解析的目标位置。 此值通常IID_IShellItem,但它也可以IID_IShellItem2或 CShellItem 实现的任何其他接口的 IID。

[out] ppv

类型: void**

指向 riid 中请求的接口的指针。

返回值

类型: HRESULT

此方法可以返回其中一个值。

返回代码 说明
S_OK
目标文件夹位于 ppv 中并返回;但是,库已更新,因此应调用 IShellLibrary::CommitIShellLibrary::Save 来保留这些更改。
S_FALSE
目标文件夹位于 ppv 中并返回。
E_
此方法可以返回其他错误值。

注解

此方法是一种阻止调用,只要 返回之前 dwTimeout 参数中指定的时间,就可以阻止调用线程。 由于它阻止从中调用它的线程,因此不应从同时处理用户界面交互的线程调用它。

如果无法解析该位置,此方法不会提示用户手动查找文件夹。

为方便起见,可以使用 SHResolveFolderPathInLibrary 代替此方法。

建议使用 objbase.h 中定义的 IID_PPV_ARGS 宏来打包 riidppv 参数。 此宏基于 ppv 中值指向的接口提供正确的 IID,这消除了编码错误的可能性。

示例

下面的代码示例演示包装此方法的帮助程序函数 SHResolveFolderPathInLibrary

//
// from shobjidl.h
//
__inline HRESULT SHResolveFolderPathInLibrary(
    __in IShellLibrary *plib,
    __in PCWSTR pszFolderPath,
    __in DWORD dwTimeout,
    __deref_out PWSTR *ppszResolvedPath
)
{
    *ppszResolvedPath = NULL;
    PIDLIST_ABSOLUTE pidlFolder = 
      SHSimpleIDListFromPath(pszFolderPath);
    HRESULT hr = pidlFolder ? S_OK : E_INVALIDARG;
    if (SUCCEEDED(hr))
    {
        IShellItem *psiFolder;
        hr = SHCreateItemFromIDList(
          pidlFolder, 
          IID_PPV_ARGS(&psiFolder));

        if (SUCCEEDED(hr))
        {
            IShellItem *psiResolved;
            hr = plib->ResolveFolder(
              psiFolder, 
              dwTimeout, 
              IID_PPV_ARGS(&psiResolved));

            if (SUCCEEDED(hr))
            {
                hr = psiResolved->GetDisplayName(
                  SIGDN_DESKTOPABSOLUTEPARSING, 
                  ppszResolvedPath);
                psiResolved->Release();
            }
            psiFolder->Release();
        }
        CoTaskMemFree(pidlFolder);
    }
    return hr;
}

要求

要求
最低受支持的客户端 Windows 7 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 R2 [仅限桌面应用]
目标平台 Windows
标头 shobjidl_core.h (包括 Shobjidl.h)

另请参阅

IShellLibrary

IShellLibrary::Commit

IShellLibrary::Save

SHResolveFolderPathInLibrary

Windows 库