Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить корневую папку диска по его названию, "Локальный диск(С:)" -> "С:\" 
V
    Опции темы
0x07L
Дата 4.9.2006, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



Никак не могу найти функцию. Помогите, если знаете. SHParseDisplayName не пашет.
PM MAIL   Вверх
Earnest
Дата 4.9.2006, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
0x07L
Дата 4.9.2006, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



А вот именно, "Локальный диск (C:)". Это имя я беру из ListView в диалоге открытия файлов (текст выделенной ячейки). Почему не пользуюсь стандартными средствами, см. форум MFC  smile 
PM MAIL   Вверх
GremlinProg
Дата 4.9.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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....seforfolder.asp


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
0x07L
Дата 4.9.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



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

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

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

Кстати, вопрос только что перестал быть важным (нашелся более правильный путь).
PM MAIL   Вверх
0x07L
Дата 6.9.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



Этот более правильный путь привел-таки меня к относительному 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, спасибо, без этой ссылки с ярлыками я бы долго возился.

Это сообщение отредактировал(а) 0x07L - 6.9.2006, 09:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.