Иллюстрированный самоучитель по Visual Studio.Net


Поиск в реестре - часть 2


В случае неудачи при поиске папки наше приложение должно вести себя разумно, и поэтому мы предлагаем пользователю самому отыскать местоположение папки, где установлена студия. Это делается путем создания и вызова специального диалога по поиску папки. Диалог использует API-функции из группы Shell-API — подмножества API, которое поддерживается Shell32.dll и использует объекты COM (Component Object Model). Для успешной работы оболочки (shell) необходимо получить указатель на интерфейс (термин из COM) iMalloc, с помощью которого производится динамическое управление памятью. С технологией СОМ мы познакомимся позже, а сейчас введите в состав оконного класса еще одну функцию.

string CLookDlg::GetPathFromUser(void)

{

//====== Путь к файлу WinError.h пока пуст

string path = "";

//====== Указатель на интерфейс IMalloc

LPMALLOC pMalloc;

if (MessageBox("He могу найти папку,"

" где расположена Studio.Net"

" \r\rBu покажете путь к ней?",

"Поиск в реестре Windows",

MB_YES NO | MB_ICONQUESTION)==IDNO

|| FAILED( SHGetMalloc(&pMallo))

return path;

BROWSEINFO bi;

ZeroMemory (Sbi,sizeof(bi));

bi.ulFlags = BIF_RETURNONLYFSDIRS;

//====== Запуск диалога поиска папки

LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

if (pidl) {

TCHAR szDir[MAX_PATH];

if (SHGetPathFromlDList(pidl,szDir))

{

path = szDir;

path += "\\Include\\Winerror.h"; }

pMalloc->Free(pidl); pMalloc->Release();

}

return path;

}

Попытка активизировать СОМ-объект и получить указатель на его интерфейс производится путем вызова функции SHGetMalloc. Первые две буквы SH означают принадлежность функции к семейству Shell-API. Макрос FAILED() проверяет на отрицательность возвращаемый функцией результат типа HRESULT, тем самым определяя факт неудачи. Структура BROWSEINFO помогает управлять параметрами диалога по поиску папки.

Примечание

Для многих стандартных диалогов типично использование специальных структур, их обслуживающих.


Начало  Назад  Вперед