如何获取打开/保存对话框(Open/Save Dialog)的PIDL?
获取打开/保存对话框PIDL的问题
我已针对该问题研究许久,目前可通过以下代码获取资源管理器对话框的PIDL:
::CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void**)&psw)
但这段代码仅能获取资源管理器对话框,我在微软文档中未找到任何关于获取打开/保存对话框PIDL的相关内容。
完整实现代码如下:
HRESULT hr = S_OK; CoInitialize(NULL); IShellWindows *psw = NULL; if (!SUCCEEDED(::CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void**)&psw)) || !psw) { CoUninitialize(); return; } long lCount = 0; if (!SUCCEEDED(psw->get_Count(&lCount))) { psw->Release(); CoUninitialize(); return; } IDispatch *pdisp = NULL; VARIANT v; V_VT(&v) = VT_I4; for (V_I4(&v) = 0; V_I4(&v) < lCount; V_I4(&v)++) { if (!SUCCEEDED(psw->Item(v, &pdisp)) || !pdisp) { continue; } IWebBrowserApp *pwba = NULL; if (!SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba)) || !pwba) { pdisp->Release(); continue; } IServiceProvider *psp = NULL; if (!SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp)) || !psp) { pdisp->Release(); pwba->Release(); continue; } IShellBrowser *psb = NULL; if (!SUCCEEDED(psp->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, (void**)&psb)) || !psb) { pdisp->Release(); pwba->Release(); psp->Release(); continue; } IShellView* psv = NULL;; if (!SUCCEEDED(psb->QueryActiveShellView(&psv)) || !psv) { pdisp->Release(); pwba->Release(); psp->Release(); psb->Release(); continue; } IFolderView2 *pfv = NULL; if (!SUCCEEDED(psv->QueryInterface(IID_IFolderView2, (void**)&pfv)) || !pfv) { pdisp->Release(); pwba->Release(); psp->Release(); psb->Release(); psv->Release(); continue; } ... }
内容的提问来源于stack exchange,提问作者Suarez Zhou
相关产品推荐
相关产品推荐

