我正在尝试使用 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()
方法。 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/