使用IShellView接口函数CreateViewWindow
下面是代码:
- IShellFolder* pShellFolderDesktop = NULL;
- hr = SHGetDesktopFolder(&pShellFolderDesktop);
- LPITEMIDLIST pidl = ILCreateFromPath(lpszPath);
- IShellFolder* pShellFolder = NULL;
- // pidl指出要浏览的folder路径
- pShellFolderDesktop->BindToObject(pidl, NULL, IID_PPV_ARGS(&pShellFolder));
- // hWndParent是自己创建的一个窗口,folder中的内容将会在该窗口中显示
- pShellFolder->CreateViewObject(hWndParent, IID_PPV_ARGS(&pShellView->m_piView);
- // 创建shell相关窗口,其实是ShellDll_DefView及子窗口SysListView(SysListView可能也有子窗口),该folder中的内容
- // 其实就是在SysListView中显示的,而ShellDll_DefView会作为hWndParent的子窗口。
- // 注意该函数的第3个参数,一定要是IShellBrowser的一个实例,而IShellBrowser又是一个纯虚类,不能直接创建该类的对象,
- //只能先实现,然后再创建,CShellBrowser就是从该类IShellBrowser派生出来的,只需要实现相关接口就行了。
- CShellBrowser* psb = new CShellBrowser;
- pShellView->m_piView->CreateViewWindow(NULL, &fs, static_cast<IShellBrowser*>(psb), const_cast<LPRECT>(&rect), &psb->m_hWnd);
实际上,CreateViewWindow的第3个参数主要是为IShellView指定一个框架,可以这样理解,为视图指定一个框架,也可以这样理解,视图必须
在框架中显示,IShellBrowser的作用就像是浏览器窗口,而IShellView就像是网页。
附CShellBrowser:
- // IServiceProvider可以没有
- class CShellBrowser : public IShellBrowser, public IServiceProvider
- {
- public:
- CShellBrowser(HINSTANCE hInstance);
- ~CShellBrowser(void);
- public:
- // IUnknown methods
- STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
- STDMETHOD_(ULONG, AddRef)(void);
- STDMETHOD_(ULONG, Release)(void);
- // IServiceProvider methods
- STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void **ppvObject);
- // IOleWindow methods
- STDMETHOD(GetWindow)(HWND *phwnd);
- STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);
- // IShellBrowser methods
- STDMETHOD(BrowseObject)(PCUIDLIST_RELATIVE pidl, UINT wFlags);
- STDMETHOD(EnableModelessSB)(BOOL fEnable);
- STDMETHOD(GetControlWindow)(UINT id, HWND *lphwnd);
- STDMETHOD(GetViewStateStream)(DWORD grfMode, IStream **ppStrm);
- STDMETHOD(InsertMenusSB)(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
- STDMETHOD(OnViewWindowActive)(IShellView *ppshv);
- STDMETHOD(QueryActiveShellView)(IShellView **ppshv);
- STDMETHOD(RemoveMenusSB)(HMENU hmenuShared);
- STDMETHOD(SendControlMsg)(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);
- STDMETHOD(SetMenuSB)(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);
- STDMETHOD(SetStatusTextSB)(LPCWSTR lpszStatusText);
- STDMETHOD(SetToolbarItems)(LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags);
- STDMETHOD(TranslateAcceleratorSB)(LPMSG lpmsg, WORD wID);
- ...
- private:
- ULONG m_ulRef;
- }
- CShellBrowser::CShellBrowser(HINSTANCE hInstance)
- : m_ulRef(0)
- , m_hInstance(hInstance)
- {
- }
- CShellBrowser::~CShellBrowser(void)
- {
- }
- // IUnknown methods
- STDMETHODIMP CShellBrowser::QueryInterface(REFIID riid, void **ppvObject)
- {
- if (ppvObject == NULL)
- return E_POINTER;
- *ppvObject = NULL;
- if (IsEqualIID(riid, IID_IUnknown))
- *ppvObject = static_cast<IUnknown*>(static_cast<IShellBrowser*>(this));
- else if (IsEqualIID(riid, IID_IOleWindow))
- *ppvObject = static_cast<IOleWindow*>(this);
- else if (IsEqualIID(riid, IID_IShellBrowser))
- *ppvObject = static_cast<IShellBrowser*>(this);
- else
- return E_NOINTERFACE;
- static_cast<IUnknown*>(*ppvObject)->AddRef();
- return S_OK;
- }
- STDMETHODIMP_(ULONG) CShellBrowser::AddRef(void)
- {
- return ++m_ulRef;
- }
- STDMETHODIMP_(ULONG) CShellBrowser::Release(void)
- {
- if (--m_ulRef == 0UL)
- {
- m_pObject = NULL;
- delete this;
- return 0UL;
- }
- return m_ulRef;
- }
- // IServiceProvider methods
- STDMETHODIMP CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
- {
- if (ppvObject == NULL)
- return E_POINTER;
- if (IsEqualGUID(guidService, SID_SShellBrowser))
- return QueryInterface(riid, ppvObject);
- return E_NOINTERFACE;
- }
- // IOleWindow methods
- STDMETHODIMP CShellBrowser::GetWindow(HWND *phwnd)
- {
- *phwnd = GetSafeHwnd();
- return S_OK;
- }
- STDMETHODIMP CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode)
- {
- return E_NOTIMPL;
- }
- // IShellBrowser methods
- STDMETHODIMP CShellBrowser::BrowseObject(PCUIDLIST_RELATIVE pidl, UINT wFlags)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::EnableModelessSB(BOOL fEnable)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd)
- {
- *lphwnd = NULL;
- return S_OK;
- }
- STDMETHODIMP CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::OnViewWindowActive(IShellView *ppshv)
- {
- return S_OK;
- }
- STDMETHODIMP CShellBrowser::QueryActiveShellView(IShellView **ppshv)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::RemoveMenusSB(HMENU hmenuShared)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::SetStatusTextSB(LPCWSTR lpszStatusText)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::SetToolbarItems(LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP CShellBrowser::TranslateAcceleratorSB(LPMSG lpmsg, WORD wID)
- {
- return E_NOTIMPL;
- }
转载于:https://blog.51cto.com/jetyi/560745
使用IShellView接口函数CreateViewWindow相关推荐
- WinCE中串口驱动及接口函数介绍(转载)
作者:ARM-WinCE 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分为MDD层和PDD层.MDD层对上层的Device Manager提供了标准的流设备驱动接口( ...
- 利用ATL创建com组件和如何在程序中使用组件的接口函数和设置接口的属性
这是一个ATL开发实例的流程: 1. 在atl中插入一个atl实例,然后添加一个类,派生自ccmdtarget. 2. 添加相应的属性或者方法,在这里需要明白一点的是,这个属性 ...
- 【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )
文章目录 一.Linux 内核 动态分配内存 系统接口函数 二.统计输出 vmalloc 分配的内存 一.Linux 内核 动态分配内存 系统接口函数 Linux 内核 " 动态分配内存 & ...
- 【转载】WinCE中串口驱动及接口函数介绍
转载自:http://blog.csdn.net/nanjianhui/article/details/2627755 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分 ...
- Go进阶(4): string接口函数+时间接口函数+内置函数+错误处理
1. string接口函数 len():内建函数,返回字符串/数组的长度,按字节(UTF-):例如,ascii字符占一个字节,汉字占三个字节: r:=[]rune(str):字符串遍历函数,同时可以处 ...
- 爱迪尔 门锁接口文档_爱迪尔门锁系统接口函数(SDK)说明
1 爱迪尔门锁系统接口函数( SDK )说明 ( 动态联接库函数说明 ) 适用门锁接口: Lock3200.DLL , Lock3200K.DLL , Lock4200.DLL , Lock4200D ...
- 【嵌入式】Libmodbus源码分析(二)-常用接口函数分析
00. 目录 文章目录 00. 目录 01. modbus常用接口函数概述 02. modbus辅助接口函数 03. modbus功能接口函数 04. modbus数据处理 05. 附录 01. mo ...
- android c 对象为空,ndk-jni中C/C++接口函数修改函数参数jobject对象成员值(数组)的有关问题...
ndk-jni中C/C++接口函数修改函数参数jobject对象成员值(数组)的问题 现java中有个类: public class TestClass { private int nValue; p ...
- 常规dll 的接口函数定义+客户端程序接口函数导入
--> blog 常规dll 的接口函数定义 extern "C" __declspec(dllexport) int addcart_Click(LPCTSTR ...
最新文章
- quartz定时任务开发cron常用网站
- 周洪立:一个外交官眼里的盛大文化
- K近邻算法你掌握了吗?来测试一下就知道了
- 设计模式(2): 观察者模式-1
- 何恺明团队最新力作SimSiam:消除表征学习“崩溃解”,探寻对比表达学习成功之根源
- Lambda的Lambda(如果可选)
- rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait
- Win7和Vista移动设备正常弹出
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A
- 排序,求最大值最小值
- 线性支持向量分类机及其实现
- 笔记本计算机怎么进入安全模式启动,笔记本电脑如何进入安全模式
- 废旧笔记本屏幕不要扔,不到200元就能DIY成便携显示器
- 极化SAR几种成像模式
- kali2020进入单模式_Kali Linux 2020.3稳定版已发布 支持自动启用HiDPI模式
- Python之爬虫和数据小解析
- vue开发公众号-关闭浏览器返回主公众号
- 测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?
- 《第一堂棒球课》:走进棒球运动
- 矩阵分析L1 线性空间基础
热门文章
- SQL Server代理(4/12):配置数据库邮件
- SpringBoot自动化配置之一:SpringBoot内部的一些自动化配置原理
- MySQL动态行转列
- AIO+BIO+NIO+同步+异步+阻塞+非阻塞
- toAppendStream doesn‘t support consuming update changes which is produced by node GroupAggregate
- migrate和syncdb的区别(转载)
- 图表达相关书书籍调研
- pickle与cpickle的用法
- java定义json数组_Java面试题:json该如何定义?json与xml的区别有哪些?
- 纽约大学计算机和信息科学专业排名,纽约大学计算机科学与信息系统世界排名2018年最新排名第33(QS世界排名)...