SHBrowseForFolder с BIF_BROWSEFORCOMPUTER и SHGetPathFromIDList не работает - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь заставить работать SHBrowseForFolder с BIF_BROWSEFORCOMPUTER, чтобы пользователь мог выбрать компьютер в сети.

Я могу получить диалоговое окно для отображения и разрешить выбор сетевого компьютера, кнопка ОК включена, но когда я нажимаю ОК, даже если функция возвращает PIDL, который не равен NULL, вызов SHGetPathFromIDList завершается неудачно и поэтому путь к удаленному компьютеру недоступен.

Вызываю ли я нужную функцию для получения имени удаленного компьютера?

Код:

UINT __stdcall BrowseForFolder()
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    // Setup browse structure.
    BROWSEINFO bi = { 0 };
    bi.lpszTitle = TEXT("Pick a Directory");
    bi.hwndOwner = GetForegroundWindow();
    bi.ulFlags = BIF_USENEWUI | BIF_BROWSEFORCOMPUTER;

    // Call 
    LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

    // Get path.
    if (pidl)
    {
        // get the name of the folder
        TCHAR path[MAX_PATH];
        if (SHGetPathFromIDList(pidl, path))    // This function fails and path is NULL.
        {
            MessageBox(GetForegroundWindow(), path, TEXT("Path"), MB_ICONINFORMATION);
        }

        // free memory used
        CoTaskMemFree(pidl);
    }

    CoUninitialize();

    return ERROR_SUCCESS;
}

1 Ответ

1 голос
/ 21 января 2020

SHGetPathFromIDList() работает только для путей к файловой системе. Сетевой компьютер не является частью файловой системы, поэтому вы не можете использовать SHGetPathFromIDList() для этой задачи.

Если вам нужно имя выбранного компьютера, вы можете:

  • используйте SHGetDesktopFolder() для получения интерфейса IShellFolder в верхней части пространства имен оболочки, а затем передайте возвращенный PIDL в его GetDisplayNameOf() метод.

  • передать возвращенный PIDL на SHGetNameFromIDList().

  • просто указать BROWSEINFO::pszDisplayName поле в буфер для диалогового окна, которое необходимо заполнить при выходе, например:

UINT __stdcall BrowseForFolder()
{
    TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH] = {};

    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    // Setup browse structure.
    BROWSEINFO bi = { 0 };
    bi.lpszTitle = TEXT("Pick a Computer");
    bi.hwndOwner = GetForegroundWindow();
    bi.pszDisplayName = szComputerName;
    bi.ulFlags = BIF_USENEWUI | BIF_BROWSEFORCOMPUTER;

    // Call 
    LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

    // Get path.
    if (pidl)
    {
        MessageBox(GetForegroundWindow(), szComputerName, TEXT("Computer Name"), MB_ICONINFORMATION);

        // free memory used
        CoTaskMemFree(pidl);
    }

    CoUninitialize();

    return ERROR_SUCCESS;
}
...