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
此方法可以返回其中一个值。
返回代码 | 说明 |
---|---|
|
目标文件夹位于 ppv 中并返回;但是,库已更新,因此应调用 IShellLibrary::Commit 或 IShellLibrary::Save 来保留这些更改。 |
|
目标文件夹位于 ppv 中并返回。 |
|
此方法可以返回其他错误值。 |
注解
此方法是一种阻止调用,只要 返回之前 dwTimeout 参数中指定的时间,就可以阻止调用线程。 由于它阻止从中调用它的线程,因此不应从同时处理用户界面交互的线程调用它。
如果无法解析该位置,此方法不会提示用户手动查找文件夹。
为方便起见,可以使用 SHResolveFolderPathInLibrary 代替此方法。
建议使用 objbase.h 中定义的 IID_PPV_ARGS 宏来打包 riid 和 ppv 参数。 此宏基于 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) |