Сообщений 5    Оценка 7        Оценить  
Система Orphus

Как получить IShellFolder для заданного файла или каталога?

Автор: Игорь Вартанов
The RSDN Group
Опубликовано: 12.08.2003
Исправлено: 13.03.2005
Версия текста: 2.0

Метод IShellFolder::BindToObject( ) позволяет получить указатель на IShellFolder для определенного файла/каталога.

 // path   - строка ANSI-символов, содержащая путь к заданному файлу/каталогу
 // hWnd   - хэндл окна, которому будут направляться сообщения об ошибках;
 //          если нет необходимости в их получении, используйте NULL

 #include <windows.h>
 #include <shlobj.h>

 #pragma comment(lib, "shell32")

 IShellFolder *pDesk = NULL, *pFolder = NULL;
 LPITEMIDLIST pidl = NULL;
 WCHAR        wpath[MAX_PATH] = {0};
 HRESULT      hr = S_FALSE;
 ULONG        fa = SFGAO_FILESYSTEM;

 hr = ::SHGetDesktopFolder( &pDesk );
 mbstowcs( wpath, path, MAX_PATH ); // ANSI to UNICODE
 wpath[ MAX_PATH - 1 ] = 0;
 hr = pDesk->ParseDisplayName( hWnd, 0, wpath, NULL, &pidl, &fa );
 if( SFGAO_FOLDER & fa )
       // каталог
       hr = pDesk->BindToObject( pidl, NULL, IID_IShellFolder, (void**)&pFolder );
    else
       // файл
       hr = ::SHBindToParent( pidl, IID_IShellFolder, (void**)&pFolder, NULL );
 . . .
 // Используем указатель pFolder
 . . .
 // Освобождаем указатель
 pFolder->Release();
 . . .
 // Освобождаем список и указатель pDesk
 CoTaskMemFree( pidl );
 pDesk->Release();

Разумеется, если в вашем распоряжении уже имеется каким-либо образом полученный pidl для заданного файла/каталога, то нет необходимости в выполнении ParseDisplayName( ) и связанного с этим конвертирования mbstowcs( ).


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 5    Оценка 7        Оценить