c++ - 带有 BIF_BROWSEFORCOMPUTER 和 SHGetPathFromIDList 的 SHBrowseForFolder 不工作

标签 c++ windows shell32

我正在尝试使用 BIF_BROWSEFORCOMPUTER 让 SHBrowseForFolder 工作,以允许用户选择网络上的计算机。

我可以让对话框显示并允许选择网络计算机,启用“确定”按钮,但是当我单击“确定”时,即使该函数返回一个不为 NULL 的 PIDL,对 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;
}

最佳答案

SHGetPathFromIDList()仅适用于文件系统路径。网络计算机不是文件系统的一部分,因此您不能使用 SHGetPathFromIDList()对于这个任务。

如果您需要所选计算机的名称,您可以:

  • 使用 SHGetDesktopFolder() 获取 IShellFolder 接口(interface)位于 Shell 命名空间的顶部,然后将返回的 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;
    }
    

    关于c++ - 带有 BIF_BROWSEFORCOMPUTER 和 SHGetPathFromIDList 的 SHBrowseForFolder 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59847081/

    相关文章:

    c++ - 为什么它在不同的 ide online 中有不同的行为

    c++ - 设备浏览问题

    windows - 如何处理 sqlite2 到 sqlite3 迁移中的 UTF-8 字符

    windows - 在硬盘上启动 native 操作系统作为虚拟机

    windows - starcluster easy_install windows

    c# - 如何从 C# 调用 SHChangeNotify 而不会出现错误 14007

    c++ - “安全”DLL 注入(inject)

    C++删除char中每个x的x字节

    c++ - 3D vector 的 SSE 对齐

    c++ - 标识符 "ostream"是未定义的错误