天天看点

IShellBrowser的获取

获取IShellBrowser

要获取该接口只能通过IServiceProvider接口,不能通过CoCreateInstance,估计是因为该接口为纯虚类

下面是获取该接口的方法:

// 通过该接口可以获取所有打开的shell窗口(例如folder窗口)  

IShellWindows *psw = NULL;  

hr = ::CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void**)&psw);  

// 获取打开的shell窗口个数.  

long lCount = 0;  

hr = psw->get_Count(&lCount);  

//SWC_EXPLORER 指出获取explorer打开的窗口,如果没有打开任何窗口则会调用失败  

//VISTA及以后的版本可以用SWC_DESKTOP,此时获取的是桌面窗口,即使没有其他shell  

//窗口,该调用也不会失败.  

VARIANT vpidl;  

vpidl.vt = VT_UI4;  

vpidl.ulVal = SWC_EXPLORER;  

IDispatch *pdisp = NULL;  

hr = psw->Item(vpidl, &pdisp);  

// 这个接口是一个控件接口,具体看MSDN吧  

IWebBrowserApp *pwba = NULL;  

hr = pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba);  

// 这个接口类厂很像,用于创建另外一些接口对象,详细内容参考MSDN.  

IServiceProvider *psp = NULL;  

hr = pwba->QueryInterface(IID_IServiceProvider, (void**)&psp);  

// SID_STopLevelBrowser指出获取最顶层的那个shell窗口.  

// 如果不明白可以调用该接口的GetControlWindow成员函数,然后再用sp++  

// 查看一下,就知道是哪个窗口了。  

IShellBrowser *psb = NULL;  

hr = psp->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, (void**)&psb);  

//使用该shell窗口浏览其它目录(pdil指出目录路径)内容,当然也可以再创建新窗口  

//psb->BrowseObject(pdil, ...)  

... 

本文转自jetyi51CTO博客,原文链接: http://blog.51cto.com/jetyi/560744,如需转载请自行联系原作者