Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Получить корневую папку диска по его названию


Автор: 0x07L 4.9.2006, 07:27
Никак не могу найти функцию. Помогите, если знаете. SHParseDisplayName не пашет.

Автор: Earnest 4.9.2006, 07:37
А просто слэш руками добавить никак? Имя диска-то "C:", а не "Локальный диск(Сsmile" 

Автор: 0x07L 4.9.2006, 07:40
А вот именно, "Локальный диск (C:)". Это имя я беру из ListView в диалоге открытия файлов (текст выделенной ячейки). Почему не пользуюсь стандартными средствами, см. форум MFC  smile 

Автор: GremlinProg 4.9.2006, 09:44
0x07L, случайно "Локальный диск(Сsmile" получаешь не из SHBrowseForFolder?

Добавлено @ 09:48 
если так, то SHParseDisplayName пахать и не должен
Код

// Get the target folder for a folder PIDL. This deals with cases where a folder
// is an alias to a real folder, folder shortcuts, the My Documents folder, etc.
STDAPI SHGetTargetFolderPath(LPCITEMIDLIST pidlFolder, LPWSTR pszPath, UINT cchPath)
{
    LPITEMIDLIST pidlTarget;
    
    *pszPath = 0;

    HRESULT hr = SHGetTargetFolderIDList(pidlFolder, &pidlTarget);
    
    if (SUCCEEDED(hr))
    {
        SHGetPathFromIDListW(pidlTarget, pszPath);   // Make sure it is a path
        CoTaskMemFree(pidlTarget);
    }
    
    return *pszPath ? S_OK : E_FAIL;
}

оригинальная ссылка:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shbrowseforfolder.asp

Автор: 0x07L 4.9.2006, 11:18
Нет, не из SHBrowseForFolder. Последняя как раз возвращает "C:\" А вообще, ты близок к истине: я добыл это из диалога открытия файлов.

Приведенная выше SHGetTargetFolderPath мне бы подошла, если б у меня был PIDL, а не строка "Локальный диск (C:)"

Но ведь должен быть способ преобразовать "Локальный диск (C:)" в "C:\". Раз Windows смог запаковать "C:\" в "Локальный диск (C:)", значит должен уметь и обратно преобразовывать (теоретически).

Кстати, вопрос только что перестал быть важным (нашелся более правильный путь).

Автор: 0x07L 6.9.2006, 08:42
Этот более правильный путь привел-таки меня к относительному PIDL и пути к родительской папке. Делаем так:
Код

// pidl - относителный PIDL объекта (файла или папки)
// cur_folder - путь к родительской папке

LPITEMIDLIST folder_pidl = ILCreateFromPath(cur_folder);

IShellFolder * psf;
SHGetDesktopFolder(&psf);

IShellFolder * new_psf = psf;
new_psf->BindToObject(folder_pidl, 0, IID_IShellFolder, reinterpret_cast<void **>(&psf));
new_psf->Release();
        
IShellLink * psl;
psf->GetUIObjectOf(m_hWnd, 1, &pidl, IID_IShellLink, 0, reinterpret_cast<void **>(&psl));
psf->Release();

LPITEMIDLIST full_pidl;
if (psl)
{
    // Это действительно ярлык
    
    psl->GetIDList(&full_pidl);
    psl->Release();

    ILFree(folder_pidl);
}
else
{
    // Не ярлык

    full_pidl = ILAppendID(folder_pidl, &(pidl->mkid), TRUE);

    // Здесь не удаляем folder_pidl, поскольку теперь full_pidl
    // указывает на то же самое, а full_pidl будет удален.
}
        
TCHAR cur_item [MAX_PATH];
SHGetPathFromIDList(full_pidl, cur_item);
ILFree(full_pidl);

Этот код работает и с ярлыками. Для папок типа "Мой компьютер" возвращает пустую строку.
Замечу, что даже у "C:\" есть родительская папка, называется "".
GremlinProg, спасибо, без этой ссылки с ярлыками я бы долго возился.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)