Поделиться через


Метод 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 или IID любого другого интерфейса, реализованного CShellItem.

[out] ppv

Тип: void**

Указатель на интерфейс, запрошенный в riid.

Возвращаемое значение

Тип: HRESULT

Этот метод может возвращать одно из этих значений.

Код возврата Описание
S_OK
Целевая папка была найдена и возвращена в ppv; Однако библиотека обновлена, поэтому для сохранения этих изменений следует вызывать IShellLibrary::Commit или IShellLibrary::Save .
S_FALSE
Целевая папка была найдена и возвращена в ppv.
E_
Этот метод может возвращать другие значения ошибок.

Комментарии

Этот метод является блокирующим вызовом, который может блокировать вызывающий поток до тех пор, пока не будет возвращено время, указанное в параметре dwTimeout . Поскольку он блокирует поток, из которого он вызывается, его не следует вызывать из потока, который также обрабатывает взаимодействия пользовательского интерфейса.

Этот метод не запрашивает у пользователя поиск папки вручную, если ему не удается разрешить расположение.

Для удобства вместо этого метода можно использовать SHResolveFolderPathInLibrary .

Рекомендуется использовать макрос IID_PPV_ARGS , определенный в Objbase.h, для упаковки параметров riid и ppv . Этот макрос предоставляет правильный IID на основе интерфейса, на который указывает значение в ppv, что исключает возможность ошибки кода.

Примеры

В следующем примере кода показана вспомогающая функция 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
Header shobjidl_core.h (включая Shobjidl.h)

См. также раздел

IShellLibrary

IShellLibrary::Commit

IShellLibrary::Save

SHResolveFolderPathInLibrary

Библиотеки Windows