下面是代码:

  1. IShellFolder* pShellFolderDesktop = NULL;
  2. hr = SHGetDesktopFolder(&pShellFolderDesktop);
  3. LPITEMIDLIST pidl = ILCreateFromPath(lpszPath);
  4. IShellFolder* pShellFolder = NULL;
  5. // pidl指出要浏览的folder路径
  6. pShellFolderDesktop->BindToObject(pidl, NULL, IID_PPV_ARGS(&pShellFolder));
  7. // hWndParent是自己创建的一个窗口,folder中的内容将会在该窗口中显示
  8. pShellFolder->CreateViewObject(hWndParent, IID_PPV_ARGS(&pShellView->m_piView);
  9. // 创建shell相关窗口,其实是ShellDll_DefView及子窗口SysListView(SysListView可能也有子窗口),该folder中的内容
  10. // 其实就是在SysListView中显示的,而ShellDll_DefView会作为hWndParent的子窗口。
  11. // 注意该函数的第3个参数,一定要是IShellBrowser的一个实例,而IShellBrowser又是一个纯虚类,不能直接创建该类的对象,
  12. //只能先实现,然后再创建,CShellBrowser就是从该类IShellBrowser派生出来的,只需要实现相关接口就行了。
  13. CShellBrowser* psb = new CShellBrowser;
  14. 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. public:
  8. // IUnknown methods
  9. STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
  10. STDMETHOD_(ULONG, AddRef)(void);
  11. STDMETHOD_(ULONG, Release)(void);
  12. // IServiceProvider methods
  13. STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void **ppvObject);
  14. // IOleWindow methods
  15. STDMETHOD(GetWindow)(HWND *phwnd);
  16. STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);
  17. // IShellBrowser methods
  18. STDMETHOD(BrowseObject)(PCUIDLIST_RELATIVE pidl, UINT wFlags);
  19. STDMETHOD(EnableModelessSB)(BOOL fEnable);
  20. STDMETHOD(GetControlWindow)(UINT id, HWND *lphwnd);
  21. STDMETHOD(GetViewStateStream)(DWORD grfMode, IStream **ppStrm);
  22. STDMETHOD(InsertMenusSB)(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
  23. STDMETHOD(OnViewWindowActive)(IShellView *ppshv);
  24. STDMETHOD(QueryActiveShellView)(IShellView **ppshv);
  25. STDMETHOD(RemoveMenusSB)(HMENU hmenuShared);
  26. STDMETHOD(SendControlMsg)(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);
  27. STDMETHOD(SetMenuSB)(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);
  28. STDMETHOD(SetStatusTextSB)(LPCWSTR lpszStatusText);
  29. STDMETHOD(SetToolbarItems)(LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags);
  30. STDMETHOD(TranslateAcceleratorSB)(LPMSG lpmsg, WORD wID);
  31. ...
  32. private:
  33. ULONG m_ulRef;
  34. }
  35. CShellBrowser::CShellBrowser(HINSTANCE hInstance)
  36. : m_ulRef(0)
  37. , m_hInstance(hInstance)
  38. {
  39. }
  40. CShellBrowser::~CShellBrowser(void)
  41. {
  42. }
  43. // IUnknown methods
  44. STDMETHODIMP CShellBrowser::QueryInterface(REFIID riid, void **ppvObject)
  45. {
  46. if (ppvObject == NULL)
  47. return E_POINTER;
  48. *ppvObject = NULL;
  49. if (IsEqualIID(riid, IID_IUnknown))
  50. *ppvObject = static_cast<IUnknown*>(static_cast<IShellBrowser*>(this));
  51. else if (IsEqualIID(riid, IID_IOleWindow))
  52. *ppvObject = static_cast<IOleWindow*>(this);
  53. else if (IsEqualIID(riid, IID_IShellBrowser))
  54. *ppvObject = static_cast<IShellBrowser*>(this);
  55. else
  56. return E_NOINTERFACE;
  57. static_cast<IUnknown*>(*ppvObject)->AddRef();
  58. return S_OK;
  59. }
  60. STDMETHODIMP_(ULONG) CShellBrowser::AddRef(void)
  61. {
  62. return ++m_ulRef;
  63. }
  64. STDMETHODIMP_(ULONG) CShellBrowser::Release(void)
  65. {
  66. if (--m_ulRef == 0UL)
  67. {
  68. m_pObject = NULL;
  69. delete this;
  70. return 0UL;
  71. }
  72. return m_ulRef;
  73. }
  74. // IServiceProvider methods
  75. STDMETHODIMP CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
  76. {
  77. if (ppvObject == NULL)
  78. return E_POINTER;
  79. if (IsEqualGUID(guidService, SID_SShellBrowser))
  80. return QueryInterface(riid, ppvObject);
  81. return E_NOINTERFACE;
  82. }
  83. // IOleWindow methods
  84. STDMETHODIMP CShellBrowser::GetWindow(HWND *phwnd)
  85. {
  86. *phwnd = GetSafeHwnd();
  87. return S_OK;
  88. }
  89. STDMETHODIMP CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode)
  90. {
  91. return E_NOTIMPL;
  92. }
  93. // IShellBrowser methods
  94. STDMETHODIMP CShellBrowser::BrowseObject(PCUIDLIST_RELATIVE pidl, UINT wFlags)
  95. {
  96. return E_NOTIMPL;
  97. }
  98. STDMETHODIMP CShellBrowser::EnableModelessSB(BOOL fEnable)
  99. {
  100. return E_NOTIMPL;
  101. }
  102. STDMETHODIMP CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd)
  103. {
  104. *lphwnd = NULL;
  105. return S_OK;
  106. }
  107. STDMETHODIMP CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)
  108. {
  109. return E_NOTIMPL;
  110. }
  111. STDMETHODIMP CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
  112. {
  113. return E_NOTIMPL;
  114. }
  115. STDMETHODIMP CShellBrowser::OnViewWindowActive(IShellView *ppshv)
  116. {
  117. return S_OK;
  118. }
  119. STDMETHODIMP CShellBrowser::QueryActiveShellView(IShellView **ppshv)
  120. {
  121. return E_NOTIMPL;
  122. }
  123. STDMETHODIMP CShellBrowser::RemoveMenusSB(HMENU hmenuShared)
  124. {
  125. return E_NOTIMPL;
  126. }
  127. STDMETHODIMP CShellBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
  128. {
  129. return E_NOTIMPL;
  130. }
  131. STDMETHODIMP CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject)
  132. {
  133. return E_NOTIMPL;
  134. }
  135. STDMETHODIMP CShellBrowser::SetStatusTextSB(LPCWSTR lpszStatusText)
  136. {
  137. return E_NOTIMPL;
  138. }
  139. STDMETHODIMP CShellBrowser::SetToolbarItems(LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags)
  140. {
  141. return E_NOTIMPL;
  142. }
  143. STDMETHODIMP CShellBrowser::TranslateAcceleratorSB(LPMSG lpmsg, WORD wID)
  144. {
  145. return E_NOTIMPL;
  146. }

转载于:https://blog.51cto.com/jetyi/560745

使用IShellView接口函数CreateViewWindow相关推荐

  1. WinCE中串口驱动及接口函数介绍(转载)

    作者:ARM-WinCE 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分为MDD层和PDD层.MDD层对上层的Device Manager提供了标准的流设备驱动接口( ...

  2. 利用ATL创建com组件和如何在程序中使用组件的接口函数和设置接口的属性

    这是一个ATL开发实例的流程: 1.       在atl中插入一个atl实例,然后添加一个类,派生自ccmdtarget. 2.       添加相应的属性或者方法,在这里需要明白一点的是,这个属性 ...

  3. 【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )

    文章目录 一.Linux 内核 动态分配内存 系统接口函数 二.统计输出 vmalloc 分配的内存 一.Linux 内核 动态分配内存 系统接口函数 Linux 内核 " 动态分配内存 & ...

  4. 【转载】WinCE中串口驱动及接口函数介绍

    转载自:http://blog.csdn.net/nanjianhui/article/details/2627755 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分 ...

  5. Go进阶(4): string接口函数+时间接口函数+内置函数+错误处理

    1. string接口函数 len():内建函数,返回字符串/数组的长度,按字节(UTF-):例如,ascii字符占一个字节,汉字占三个字节: r:=[]rune(str):字符串遍历函数,同时可以处 ...

  6. 爱迪尔 门锁接口文档_爱迪尔门锁系统接口函数(SDK)说明

    1 爱迪尔门锁系统接口函数( SDK )说明 ( 动态联接库函数说明 ) 适用门锁接口: Lock3200.DLL , Lock3200K.DLL , Lock4200.DLL , Lock4200D ...

  7. 【嵌入式】Libmodbus源码分析(二)-常用接口函数分析

    00. 目录 文章目录 00. 目录 01. modbus常用接口函数概述 02. modbus辅助接口函数 03. modbus功能接口函数 04. modbus数据处理 05. 附录 01. mo ...

  8. android c 对象为空,ndk-jni中C/C++接口函数修改函数参数jobject对象成员值(数组)的有关问题...

    ndk-jni中C/C++接口函数修改函数参数jobject对象成员值(数组)的问题 现java中有个类: public class TestClass { private int nValue; p ...

  9. 常规dll 的接口函数定义+客户端程序接口函数导入

    --> blog 常规dll 的接口函数定义       extern "C" __declspec(dllexport) int addcart_Click(LPCTSTR ...

最新文章

  1. quartz定时任务开发cron常用网站
  2. 周洪立:一个外交官眼里的盛大文化
  3. K近邻算法你掌握了吗?来测试一下就知道了
  4. 设计模式(2): 观察者模式-1
  5. 何恺明团队最新力作SimSiam:消除表征学习“崩溃解”,探寻对比表达学习成功之根源
  6. Lambda的Lambda(如果可选)
  7. rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait
  8. Win7和Vista移动设备正常弹出
  9. 基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A
  10. 排序,求最大值最小值
  11. 线性支持向量分类机及其实现
  12. 笔记本计算机怎么进入安全模式启动,笔记本电脑如何进入安全模式
  13. 废旧笔记本屏幕不要扔,不到200元就能DIY成便携显示器
  14. 极化SAR几种成像模式
  15. kali2020进入单模式_Kali Linux 2020.3稳定版已发布 支持自动启用HiDPI模式
  16. Python之爬虫和数据小解析
  17. vue开发公众号-关闭浏览器返回主公众号
  18. 测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?
  19. 《第一堂棒球课》:走进棒球运动
  20. 矩阵分析L1 线性空间基础

热门文章

  1. SQL Server代理(4/12):配置数据库邮件
  2. SpringBoot自动化配置之一:SpringBoot内部的一些自动化配置原理
  3. MySQL动态行转列
  4. AIO+BIO+NIO+同步+异步+阻塞+非阻塞
  5. toAppendStream doesn‘t support consuming update changes which is produced by node GroupAggregate
  6. migrate和syncdb的区别(转载)
  7. 图表达相关书书籍调研
  8. pickle与cpickle的用法
  9. java定义json数组_Java面试题:json该如何定义?json与xml的区别有哪些?
  10. 纽约大学计算机和信息科学专业排名,纽约大学计算机科学与信息系统世界排名2018年最新排名第33(QS世界排名)...