Сообщений 5 Оценка 7 Оценить |
Метод 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 Оценить |