Проблема с SHBrowseForFolder

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

04 окт 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;
}
Но, как вы уже наверное догадались - ничего не работает. Может кто сталкивался с такой проблемой. Подскажите.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

04 окт 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;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить