CMFCShellTreeCtrl在win7下打开家庭组断言BUG

2023-05-16

如图中所示:打开家庭组的时候会出现断言错误.

解决方法:重新添加一个类,继承CMFCShellTreeCtrl,然后重写

HRESULT CMyShellTree::EnumObjects(HTREEITEM hParentItem, LPSHELLFOLDER pParentFolder, LPITEMIDLIST pidlParent)

这个函数.

具体函数代码:

HRESULT CMyShellTree::EnumObjects(HTREEITEM hParentItem, LPSHELLFOLDER pParentFolder, LPITEMIDLIST pidlParent)
{
	ASSERT_VALID(this);
	//ASSERT_VALID(afxShellManager);//修改第一处,删除本行

	LPENUMIDLIST pEnum;

	HRESULT hr = pParentFolder->EnumObjects(NULL, m_dwFlags, &pEnum);
	if (FAILED(hr) || pEnum == NULL)//修改第二处,当pEnum == NULL是也要结束
	{
		return hr;
	}

	LPITEMIDLIST pidlTemp;
	DWORD dwFetched = 1;

	// Enumerate the item's PIDLs:
	while (SUCCEEDED(pEnum->Next(1, &pidlTemp, &dwFetched)) && dwFetched)
	{
		TVITEM tvItem;
		ZeroMemory(&tvItem, sizeof(tvItem));

		// Fill in the TV_ITEM structure for this item:
		tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;

		// AddRef the parent folder so it's pointer stays valid:
		pParentFolder->AddRef();

		// Put the private information in the lParam:
		LPAFX_SHELLITEMINFO pItem = (LPAFX_SHELLITEMINFO)GlobalAlloc(GPTR, sizeof(AFX_SHELLITEMINFO));
		ENSURE(pItem != NULL);

		pItem->pidlRel = pidlTemp;
		//修改第三处,theApp.GetShellManager()代替afxShellManager
		pItem->pidlFQ = theApp.GetShellManager()->ConcatenateItem(pidlParent, pidlTemp);

		pItem->pParentFolder = pParentFolder;
		tvItem.lParam = (LPARAM)pItem;

		CString strItem = OnGetItemText(pItem);
		tvItem.pszText = strItem.GetBuffer(strItem.GetLength());
		tvItem.iImage = OnGetItemIcon(pItem, FALSE);
		tvItem.iSelectedImage = OnGetItemIcon(pItem, TRUE);

		// Determine if the item has children:
		DWORD dwAttribs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_DISPLAYATTRMASK | SFGAO_CANRENAME;

		pParentFolder->GetAttributesOf(1, (LPCITEMIDLIST*) &pidlTemp, &dwAttribs);
		tvItem.cChildren = (dwAttribs & SFGAO_HASSUBFOLDER);

		// Determine if the item is shared:
		if (dwAttribs & SFGAO_SHARE)
		{
			tvItem.mask |= TVIF_STATE;
			tvItem.stateMask |= TVIS_OVERLAYMASK;
			tvItem.state |= INDEXTOOVERLAYMASK(1); //1 is the index for the shared overlay image
		}

		// Fill in the TV_INSERTSTRUCT structure for this item:
		TVINSERTSTRUCT tvInsert;

		tvInsert.item = tvItem;
		tvInsert.hInsertAfter = TVI_LAST;
		tvInsert.hParent = hParentItem;

		InsertItem(&tvInsert);
		dwFetched = 0;
	}

	pEnum->Release();
	return S_OK;
}

示例代码下载链接:http://download.csdn.net/detail/qq_23992597/9582791


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMFCShellTreeCtrl在win7下打开家庭组断言BUG 的相关文章

随机推荐

  • LibreOJ - 10015 扩散

    题目描述 一个点每过一个单位时间就会向 4 个方向扩散一个距离 xff0c 如图所示 xff1a 两个点 a b 连通 xff0c 记作 e a b xff0c 当且仅当 a b 的扩散区域有公共部分 连通块的定义是块内的任意两个点 u v
  • Python 生成器 (通俗讲解)

    一 生成器的本质 生成器是含有yield语句 xff08 或yield表达式 xff09 的函数所返回的对象 也就是说 xff0c 要创建一个生成器 xff0c 我们首先要定义一个函数 xff0c 该函数内将使用yield表达式或yield
  • (三)MNN与Opencl联合编译

    在MNN与opencl进行联合编译中 xff0c 需要注意一些事项 xff1a 1 在MNN中cmakelists进行修改后 2 在source backend opencl core runtime中OpenCLWarpper cpp中文
  • Linux文件系统操作命令

    一 目录类命令 ls 查看文件或目录的工具 xff0c 列出目录 用法 xff1a ls 选项 文件 选项 l 以长格式显示目录下的内容列表 输出的信息从左到右依次包括文件名 xff0c 文件类型 权限模式 硬连接数 所有者 组 文件大小和
  • Windows 11安装安卓子系统步骤

    1 win11开启虚拟平台 如下图 xff0c 进入设置界面 xff0c 应用 可选功能 更多 Windows 功能 勾选 Hyper V 和 虚拟机平台 xff0c 重启系统 2 下载安装子系统 打开地址 xff1a https stor
  • linux系统使用docker部署gitlab

    1 安装docker docker安装见我之前的文章 xff1a http t csdn cn H4wAm 2 拉取gitlab镜像 gitlab ce社区版最新版 docker pull gitlab gitlab ce latest g
  • ubuntu 18.10安装ssh软件

    ubuntu 18 10 ssh软件安装步骤 xff1a 输入 Ctrl 43 Alt 43 T 打开命令终端 xff1b 输入 sudo apt get update 更新源列表 xff1b 在输入命令后 xff0c 显示的是输入密码操作
  • Clion(2023)+QT(6.5)+cmake+vcpkg+Opencv(4.7)环境安装与使用

    用习惯了Clion xff0c 智能提示很棒 xff0c 就不想用Qt自带的creator编辑器 xff0c 并且新版的Clion支持编辑ui文件 于是搜罗了一下教程搭配一下环境安装 xff0c 其实最重要的还是cmakelist的编写 Q
  • QPushButton样式设置

    1 无样式的按钮 2 改变字体颜色 color span class token operator span ff0000 span class token punctuation span 3 改变字体 font span class t
  • linux进程间通信--共享内存(POSIX 版本)

    linux进程间通信 共享内存 POSIX 版本 System V共享内存模型使用的是key和标识符 xff0c 这与标准的UNIX I O模型使用文件名和描述符的做法不一致 这种差异导致System V共享内存段需要一整套全新的系统调用和
  • 软件工程 瀑布模型、原型模型、喷泉模型和V模型的优缺点及适用场景

    一 瀑布模型 瀑布模型 xff08 Waterfall Model xff09 是一个项目开发架构 xff0c 开发过程是通过设计一系列阶段顺序展开的 xff0c 从系统需求分析开始直到产品发布和维护 xff0c 每个阶段都会产生循环反馈
  • Ubuntu18.04 配置 Xrdp 远程桌面服务

    Ubuntu18 04 配置 Xrdp 远程桌面服务 Ubuntu18 04 配置 Xrdp 远程桌面服务安装桌面环境安装 Xrdp配置 Xrdp防火墙配置 1 连接远程桌面问题解决 2 参考链接 Ubuntu18 04 配置 Xrdp 远
  • linux系统中同时开启wifi与热点的办法

    如果你在linux操作系统中有同时开启wifi与热点的需求 xff0c 请按下面的办法操作 目前开启热点后会自动关闭wifi 同时开启wifi与热点的办法 1 准备工作 查看是否支持AP模式 iw list 找到这个 xff0c 表示支持A
  • Couldn't find executable named joy_node below /opt/ros/kinetic/share/joy解决方法

    最近想用joy node这个节点 xff0c 然后就通过 sudo apt get install ros kinetic joy 去安装 xff0c 然后运行rosrun joy joy node时候一直错误显示Segmentation
  • Android P中的AVB2.0校验

    avb校验功能主要是由external avb libavb库实现的 xff0c 该库主要完成的工作包括各个分区镜像的校验 xff0c 签名验证 xff0c 以及vbmeta数据的解析 xff0c 包括了各种flags的处理以及dm ver
  • linux:nohup命令用法

    启动示例 nohup java jar infos 1 0 0 jar gt dev null 2 gt amp 1 amp 这句命令的含义是 xff1a 使用nohup来启动 xff0c 并将日志输入到黑洞目录以实现不记录nohup ou
  • cas进行sso单点登录,解决重定向url中带 ;jsessionid=xxx,url路径不合法的问题

    cas进行sso单点登录时 解决重定向url中带 jsessionid 61 xxx url路径不合法的问题 Servlet3 0规范中的允许你定义JSESSIONID是存储在cookie中还是URL参数中 如果会话ID存储在URL中 xf
  • 将Sublime Text 3 打造成 C/C++编译器

    本文介绍Sublime Text 3的C C 43 43 开发环境搭建 xff0c 包括MinGW的安装 xff0c gcc运行c语言 xff0c g 43 43 运行c 43 43 语言 xff0c 在sublime中运行以及在cmd中运
  • 201809-3 元素选择器(100分)

    1 首先标签选择器和id选择器是很简单的 xff0c 只需要注意标签大小写不敏感 xff0c id大小写敏感就可以拿到50分了 2 难的是后代选择器 xff0c 按照题目给的思路 xff0c 先找到所有满足最后一个选择器的元素列表 xff0
  • CMFCShellTreeCtrl在win7下打开家庭组断言BUG

    如图中所示 打开家庭组的时候会出现断言错误 解决方法 重新添加一个类 继承CMFCShellTreeCtrl 然后重写 HRESULT CMyShellTree EnumObjects HTREEITEM hParentItem LPSHE