移除远程位置后,如何让Windows Explorer实例导航至默认目录?
问题
我做的项目是在Windows资源管理器中创建图标以访问远程位置,让Windows上的导航体验和本地文件系统一致。目前添加、移除该位置图标的功能已正常工作,但如果Windows资源管理器在图标移除前已打开该远程位置,移除后仍会显示该位置,任何交互操作都会触发报错。
我的目标是:移除远程位置时,让所有打开该位置的Windows资源管理器实例自动导航到默认位置(如用户目录)。
已实现功能
已成功获取所有打开的Windows资源管理器实例及其当前打开的路径,代码如下:
std::vector<IWebBrowserApp*> getOpenWindowsExplorers() { std::vector<IWebBrowserApp*> openExplorers; IShellWindows *psw; if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void**)&psw))) { VARIANT v; V_VT(&v) = VT_I4; IDispatch *pdisp; BOOL fFound = FALSE; for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK;V_I4(&v)++) { IWebBrowserApp *pwba; if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) { openExplorers.push_back(pwba); } pdisp->Release(); } psw->Release(); } return openExplorers; } QString getCurrentOpenFolder(IWebBrowserApp* explorer) { QString folderPath; IServiceProvider *psp; if (SUCCEEDED(explorer->QueryInterface(IID_IServiceProvider, (void**)&psp))) { IShellBrowser *psb; if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, (void**)&psb))) { IShellView *psv; if (SUCCEEDED(psb->QueryActiveShellView(&psv))) { IFolderView *pfv; if (SUCCEEDED(psv->QueryInterface(IID_IFolderView, (void**)&pfv))) { IPersistFolder2 *ppf2; if (SUCCEEDED(pfv->GetFolder(IID_IPersistFolder2, (void**)&ppf2))) { LPITEMIDLIST pidlFolder; if (SUCCEEDED(ppf2->GetCurFolder(&pidlFolder))) { TCHAR g_szPath[MAX_PATH]; if (SHGetPathFromIDList(pidlFolder, g_szPath)) { folderPath = QString::fromWCharArray(g_szPath); } CoTaskMemFree(pidlFolder); } ppf2->Release(); } pfv->Release(); } psv->Release(); } psb->Release(); } psp->Release(); } return folderPath; }
当前困惑
找不到设置Windows资源管理器路径的官方/非官方文档,目前找到两个线索但不确定如何使用:
IPersistFolder的Initialize方法似乎可实现需求,但需要PCIDLIST参数,不清楚如何获取用户目录或其他硬编码路径对应的PCIDLIST,官方文档也未说明具体使用方法。IWebBrowser::Navigate方法看似符合需求,但相关文档为非官方内容,没有参数说明,官方文档也未提及该方法。
请问实现该需求的最佳方式是什么?
内容的提问来源于stack exchange,提问作者Mickaël C. Guimarães
相关产品推荐
相关产品推荐

