使用IShellView接口函数CreateViewWindow

简介:

下面是代码: 

 
  1. IShellFolder* pShellFolderDesktop = NULL;  
  2. hr = SHGetDesktopFolder(&pShellFolderDesktop);  
  3. LPITEMIDLIST pidl = ILCreateFromPath(lpszPath);  
  4. IShellFolder* pShellFolder = NULL;  
  5.       
  6. // pidl指出要浏览的folder路径  
  7. pShellFolderDesktop->BindToObject(pidl, NULL, IID_PPV_ARGS(&pShellFolder));  
  8.       
  9. // hWndParent是自己创建的一个窗口,folder中的内容将会在该窗口中显示  
  10. pShellFolder->CreateViewObject(hWndParent, IID_PPV_ARGS(&pShellView->m_piView);   
  11.       
  12. // 创建shell相关窗口,其实是ShellDll_DefView及子窗口SysListView(SysListView可能也有子窗口),该folder中的内容  
  13. // 其实就是在SysListView中显示的,而ShellDll_DefView会作为hWndParent的子窗口。  
  14. // 注意该函数的第3个参数,一定要是IShellBrowser的一个实例,而IShellBrowser又是一个纯虚类,不能直接创建该类的对象,  
  15. //只能先实现,然后再创建,CShellBrowser就是从该类IShellBrowser派生出来的,只需要实现相关接口就行了。  
  16. CShellBrowser* psb = new CShellBrowser;  
  17. pShellView->m_piView->CreateViewWindow(NULL, &fs, static_cast<IShellBrowser*>(psb), const_cast<LPRECT>(&rect), &psb->m_hWnd); 

实际上,CreateViewWindow的第3个参数主要是为IShellView指定一个框架,可以这样理解,为视图指定一个框架,也可以这样理解,视图必须
在框架中显示,IShellBrowser的作用就像是浏览器窗口,而IShellView就像是网页。
附CShellBrowser:
 

 

 
  1. // IServiceProvider可以没有  
  2. class CShellBrowser : public IShellBrowser, public IServiceProvider  
  3. {  
  4. public:  
  5.     CShellBrowser(HINSTANCE hInstance);  
  6.     ~CShellBrowser(void);  
  7.  
  8. public:  
  9.     // IUnknown methods  
  10.     STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);  
  11.     STDMETHOD_(ULONG, AddRef)(void);  
  12.     STDMETHOD_(ULONG, Release)(void);  
  13.  
  14.     // IServiceProvider methods  
  15.     STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void **ppvObject);  
  16.  
  17.     // IOleWindow methods  
  18.     STDMETHOD(GetWindow)(HWND *phwnd);  
  19.     STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);  
  20.  
  21.     // IShellBrowser methods  
  22.     STDMETHOD(BrowseObject)(PCUIDLIST_RELATIVE pidl, UINT wFlags);  
  23.     STDMETHOD(EnableModelessSB)(BOOL fEnable);  
  24.     STDMETHOD(GetControlWindow)(UINT id, HWND *lphwnd);  
  25.     STDMETHOD(GetViewStateStream)(DWORD grfMode, IStream **ppStrm);  
  26.     STDMETHOD(InsertMenusSB)(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);  
  27.     STDMETHOD(OnViewWindowActive)(IShellView *ppshv);  
  28.     STDMETHOD(QueryActiveShellView)(IShellView **ppshv);  
  29.     STDMETHOD(RemoveMenusSB)(HMENU hmenuShared);  
  30.     STDMETHOD(SendControlMsg)(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);  
  31.     STDMETHOD(SetMenuSB)(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);  
  32.     STDMETHOD(SetStatusTextSB)(LPCWSTR lpszStatusText);  
  33.     STDMETHOD(SetToolbarItems)(LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags);  
  34.     STDMETHOD(TranslateAcceleratorSB)(LPMSG lpmsg, WORD wID);  
  35.  
  36.     ...  
  37. private:  
  38.     ULONG m_ulRef;  
  39. }  
  40.  
  41. CShellBrowser::CShellBrowser(HINSTANCE hInstance)  
  42. : m_ulRef(0)  
  43. , m_hInstance(hInstance)  
  44. {  
  45. }  
  46.  
  47. CShellBrowser::~CShellBrowser(void)  
  48. {  
  49.  
  50. }  
  51.  
  52. // IUnknown methods  
  53. STDMETHODIMP CShellBrowser::QueryInterface(REFIID riid, void **ppvObject)  
  54. {  
  55.     if (ppvObject == NULL)  
  56.         return E_POINTER;  
  57.  
  58.     *ppvObject = NULL;  
  59.  
  60.     if (IsEqualIID(riid, IID_IUnknown))  
  61.         *ppvObject = static_cast<IUnknown*>(static_cast<IShellBrowser*>(this));  
  62.     else if (IsEqualIID(riid, IID_IOleWindow))  
  63.         *ppvObject = static_cast<IOleWindow*>(this);  
  64.     else if (IsEqualIID(riid, IID_IShellBrowser))  
  65.         *ppvObject = static_cast<IShellBrowser*>(this);  
  66.     else 
  67.         return E_NOINTERFACE;  
  68.  
  69.     static_cast<IUnknown*>(*ppvObject)->AddRef();  
  70.  
  71.     return S_OK;  
  72. }  
  73.  
  74. STDMETHODIMP_(ULONG) CShellBrowser::AddRef(void)  
  75. {  
  76.     return ++m_ulRef;  
  77. }  
  78.  
  79. STDMETHODIMP_(ULONG) CShellBrowser::Release(void)  
  80. {  
  81.     if (--m_ulRef == 0UL)  
  82.     {  
  83.         m_pObject = NULL;  
  84.         delete this;  
  85.         return 0UL;  
  86.     }  
  87.  
  88.     return m_ulRef;  
  89. }  
  90.  
  91. // IServiceProvider methods  
  92. STDMETHODIMP CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)  
  93. {  
  94.     if (ppvObject == NULL)  
  95.         return E_POINTER;  
  96.  
  97.     if (IsEqualGUID(guidService, SID_SShellBrowser))  
  98.         return QueryInterface(riid, ppvObject);  
  99.  
  100.     return E_NOINTERFACE;  
  101. }  
  102.  
  103. // IOleWindow methods  
  104. STDMETHODIMP CShellBrowser::GetWindow(HWND *phwnd)  
  105. {  
  106.     *phwnd = GetSafeHwnd();  
  107.     return S_OK;  
  108. }  
  109.  
  110. STDMETHODIMP CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode)  
  111. {  
  112.     return E_NOTIMPL;  
  113. }  
  114.  
  115. // IShellBrowser methods  
  116. STDMETHODIMP CShellBrowser::BrowseObject(PCUIDLIST_RELATIVE pidl, UINT wFlags)  
  117. {  
  118.     return E_NOTIMPL;  
  119. }  
  120.  
  121. STDMETHODIMP CShellBrowser::EnableModelessSB(BOOL fEnable)  
  122. {  
  123.     return E_NOTIMPL;  
  124. }  
  125.  
  126. STDMETHODIMP CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd)  
  127. {  
  128.     *lphwnd = NULL;  
  129.     return S_OK;  
  130. }  
  131.  
  132. STDMETHODIMP CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)  
  133. {  
  134.     return E_NOTIMPL;  
  135. }  
  136.  
  137. STDMETHODIMP CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)  
  138. {  
  139.     return E_NOTIMPL;  
  140. }  
  141.  
  142. STDMETHODIMP CShellBrowser::OnViewWindowActive(IShellView *ppshv)  
  143. {  
  144.     return S_OK;  
  145. }  
  146.  
  147. STDMETHODIMP CShellBrowser::QueryActiveShellView(IShellView **ppshv)  
  148. {  
  149.     return E_NOTIMPL;  
  150. }  
  151.  
  152. STDMETHODIMP CShellBrowser::RemoveMenusSB(HMENU hmenuShared)  
  153. {  
  154.     return E_NOTIMPL;  
  155. }  
  156.  
  157. STDMETHODIMP CShellBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)  
  158. {  
  159.     return E_NOTIMPL;  
  160. }  
  161.  
  162. STDMETHODIMP CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject)  
  163. {  
  164.     return E_NOTIMPL;  
  165. }  
  166.  
  167. STDMETHODIMP CShellBrowser::SetStatusTextSB(LPCWSTR lpszStatusText)  
  168. {  
  169.     return E_NOTIMPL;  
  170. }  
  171.  
  172. STDMETHODIMP CShellBrowser::SetToolbarItems(LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags)  
  173. {  
  174.     return E_NOTIMPL;  
  175. }  
  176.  
  177. STDMETHODIMP CShellBrowser::TranslateAcceleratorSB(LPMSG lpmsg, WORD wID)  
  178. {  
  179.     return E_NOTIMPL;  

 










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





相关文章
|
1月前
|
编译器 Linux C语言
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
30 0
|
29天前
|
存储 算法 C语言
从C语言到C++_16(list的介绍和常用接口函数)
从C语言到C++_16(list的介绍和常用接口函数)
16 0
|
1月前
|
存储 编译器 C语言
C语言:底层剖析——函数栈帧的创建和销毁
C语言:底层剖析——函数栈帧的创建和销毁
|
10月前
|
存储 编译器 C语言
C语言知识之结构体及实用调试技巧(二)
C语言知识之结构体及实用调试技巧(二)
61 0
|
7月前
|
存储 Windows
2.1 Windows驱动开发:内核链表与结构体
在`Windows`内核中,为了实现高效的数据结构操作,通常会使用链表和结构体相结合的方式进行数据存储和操作。内核提供了一个专门用于链表操作的数据结构`LIST_ENTRY`,可以用来描述一个链表中的每一个节点。使用链表来存储结构体时,需要在结构体中嵌入一个`LIST_ENTRY`类型的成员变量,用来连接相邻的节点。通过一些列链表操作函数,如`InitializeListHead、InsertHeadList、InsertTailList、RemoveEntryList`等,可以对链表中的结构体进行插入、删除、遍历等操作。
46 0
2.1 Windows驱动开发:内核链表与结构体
|
1月前
|
编译器 C语言
C语言中函数宏的三种封装方式详解
C语言中函数宏的三种封装方式详解
57 0
|
9月前
|
算法 Linux C语言
Linux驱动中常用的一些接口函数
Linux驱动中常用的一些接口函数
|
11月前
|
Linux 编译器
Linux设备驱动---字符设备驱动接口函数
Linux设备驱动---字符设备驱动接口函数
110 1
|
10月前
|
C语言
C语言知识之结构体及实用调试技巧(一)
C语言知识之结构体及实用调试技巧
47 0