PDA

Просмотр полной версии : Проблема с SHBrowseForFolder



Romeo
04.10.2004, 19:29
Мне требуется чтобы я давал SHBrowseForFolder'у строчку, содержащуй путь, и при открытии диалога дерево каталогов раскрывалось и соответствующая директория выделялась. Почитал в MSDN: это можно сделать с помощью механизма callback. Функция которую я пихаю этому хитрому shell'у выглядит следующим образом:


int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED)
{
LPCOLESTR strPath = (LPCOLESTR)lpData;
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)strPath);
}
return 0;
}

Но, как вы уже наверное догадались - ничего не работает. Может кто сталкивался с такой проблемой. Подскажите.

Romeo
04.10.2004, 20:33
Всё, тревога отменяется. Проблему решил. Почему-то этот shell широкую строку не кушает (хотя в MSDN сказано обратное), а вот PIDL - за милую душу слопал :)


int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED)
{
LPCOLESTR strPath = (LPCOLESTR)lpData;

CComPtr<IShellFolder> spDesktopFolder;
::SHGetDesktopFolder(&spDesktopFolder);

LPITEMIDLIST lpItemIDList;
HRESULT hr = spDesktopFolder->ParseDisplayName(NULL, NULL, const_cast<LPOLESTR>(strPath), NULL, &lpItemIDList, NULL);
if (FAILED(hr))
{
return 0;
}

::SendMessage(hwnd, BFFM_SETEXPANDED, FALSE, (LPARAM)lpItemIDList);
::SendMessage(hwnd, BFFM_SETSELECTION, FALSE, (LPARAM)lpItemIDList);

IMallocPtr spMalloc;
::SHGetMalloc(&spMalloc);
spMalloc->Free(lpItemIDList);
}
return 0;
}