Вот код: int CALLBACK fnсallback(HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData) { switch(msg) { case BFFM_INITIALIZED: if(lpData) ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData); //это соообщение посылается окну диалога выбора папки break; } return 0; } if(SUCCEEDED(CoInitialize(NULL))) //инициализируем СОМ { LPITEMIDLIST pidl = NULL; //ПИДЛ TCHAR szCurDir[MAX_PATH] = {0}; GetCurrentDirectory(MAX_PATH, szCurDir); SHGetSpecialFolderLocation(this->m_hWnd, CSIDL_NETWORK, &pidl); BROWSEINFO bi = {0}; bi.hwndOwner = this->m_hWnd; bi.pidlRoot = pidl; //если НУЛЛ, то поиск начинается как установит система(??? с Десктопа) bi.lpszTitle = _T("Select folder for proect"); //заголовок диалога bi.lParam = 0;//(LPARAM)szCurDir; //эти данные посылаются каллвак ф-ии 4м параметром bi.lpfn = fnсallback; bi.ulFlags = BIF_BROWSEFORCOMPUTER /*| BIF_NEWDIALOGSTYLE | BIF_NONEWFOLDERBUTTON*/; pidl = SHBrowseForFolder(&bi); if(pidl) { TCHAR szDisplayName[MAX_PATH]; SHGetPathFromIDList(pidl, szDisplayName); ::SetDlgItemText(this->m_hWnd, IDC_HOST, /*bi.p*/szDisplayName); // ::MessageBox(NULL, szDisplayName, _T("Мы остановились на..."), MB_OK); CoTaskMemFree(pidl); } CoUninitialize(); } При выборе компьютера из сети и щелчке на нём не получаю имени компьютера, например //donaire а если выберу папку на этом комп., то строка возвращается, например //donaire/my_folder Какие надо флаги ставить, как решить проблему?
Код (Text): pidl = SHBrowseForFolder(&bi); IShellFolder *iSF = NULL; STRRET sr; SHGetDesktopFolder(&iSF); iSF->GetDisplayNameOf( pidl, SHGDN_FORPARSING, &sr ); wprintf(L"%s\n", sr.pOleStr ); У меня так заработало