(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开
原文
(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~)
接上一篇:(C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹
让我们详细解释一下 Shell 编程中最基本的一些函数、结构体和枚举。
SHGetDesktopFolder 获取桌面的 IShellFolder 接口
 [DllImport("shell32.dll")]
[DllImport("shell32.dll")]  public static extern Int32 SHGetDesktopFolder(out IntPtr ppshf);
        public static extern Int32 SHGetDesktopFolder(out IntPtr ppshf);要使用这个函数,必须先定义一个 IntPtr 指针。然后通过指针,使用 GetObjectForIUnknown 返回通过指向 COM 对象的 IShellFolder 接口的指针实例。于是需要编写以下函数:
 public static IShellFolder GetDesktopFolder(out IntPtr ppshf)
public static IShellFolder GetDesktopFolder(out IntPtr ppshf)  {
        {  SHGetDesktopFolder(out ppshf);
            SHGetDesktopFolder(out ppshf);  Object obj = Marshal.GetObjectForIUnknown(ppshf);
            Object obj = Marshal.GetObjectForIUnknown(ppshf);  return (IShellFolder)obj;
            return (IShellFolder)obj;  }
        }ParseDisplayName 
获得对象的PIDL,即便对象在目录树中处于当前目录下一层或更多层。例如,对于文件对象来说,它的解析名就是它的路径,我们用文件系统对象的完全路径名来调用桌面的IshellFolder接口的 ParseDisplayName 方法,它会返回这个对象的完全PIDL。定义:
 void ParseDisplayName(
void ParseDisplayName(  IntPtr hwnd,
            IntPtr hwnd,  IntPtr pbc,
            IntPtr pbc,  [MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,
            [MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,  out uint pchEaten,
            out uint pchEaten,  out IntPtr ppidl,
            out IntPtr ppidl,  ref uint pdwAttributes);
            ref uint pdwAttributes);里面最重要的参数就是 out IntPtr ppidl 了,它返回 pszDisplayName 指定路径对应的 PIDL。然而仅仅是 PIDL 并不能让你做更多的事情。这时候还需要调用 BindToObject 来返回 IShellFolder 接口。
BindToObject 
根据 PIDL 创建和初始化 IShellFolder 对象。定义:
 void BindToObject(
void BindToObject(  IntPtr pidl,
            IntPtr pidl,  IntPtr pbc,
            IntPtr pbc,  [In()] ref Guid riid,
            [In()] ref Guid riid,  out IShellFolder ppv);
            out IShellFolder ppv);里面有一个 [In()] ref Guid riid 参数,表示接口的接口标识符 (IID)。GUID其实就是一个唯一的标识符。世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。我们这里使用 IID_IShellFolder 表示它获取的是一个 IShellFolder 接口。
 public static Guid IID_IShellFolder = new Guid("{000214E6-0000-0000-C000-000000000046}");
public static Guid IID_IShellFolder = new Guid("{000214E6-0000-0000-C000-000000000046}");另外介绍 IEnumIDList 接口。IEnumIDList 接口使资源管理器获得文件夹包含的全部对象的PIDL,PIDL然后可以用来获得这些对象的信息。
因此,我们使用 EnumObjects 函数返回的将是 IEnumIDList 的指针:
 int EnumObjects(IntPtr hWnd, SHCONTF flags, out IntPtr enumIDList);
int EnumObjects(IntPtr hWnd, SHCONTF flags, out IntPtr enumIDList);其中 flags 是 SHCONTF 枚举类型,它决定了枚举的内容:
因此,我们可以通过 flags 的不同来分别列举子文件和子目录。这里会遇到一个问题,怎么获取 PIDL 对象的名称呢。这里编写了2个函数,可以通过 PIDL 或者 IShellFolder 返回对象的名称(详细解释留到下一节):
例子二,从“桌面”开始展开
这个例子将使你深入理解之前的内容。它是这样的一个例子,允许你从“桌面”开始,一直展开到最深层的对象。
照例,附图片和源代码:

源代码:/Files/lemony/WinShell2.rar
下一节将讲述 Shell 编程中的 IContextMenu ,也就是上下文菜单,将使你的应用程序列举 Shell 对象的同时,还能在右键操控它们的菜单。
(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开的更多相关文章
- (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
		原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ... 
- C#)Windows Shell 编程系列5 - 获取图标
		原文 C#)Windows Shell 编程系列5 - 获取图标 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 编程系列4 - 上下 ... 
- (C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
		原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:( ... 
- (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹
		原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ... 
- [转]Windows Shell 编程 第二章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987893】
		第二章Shell的结构 “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ... 
- shell编程系列10--文本处理三剑客之sed利用sed查询特定内容
		shell编程系列10--文本处理三剑客之sed利用sed查询特定内容 利用sed查找文件内容: pattern种类: .8p .,10p .,+5p ./regexp/p .,/regexp/p . ... 
- shell编程系列25--shell操作数据库实战之备份MySQL数据,并通过FTP将其传输到远端主机
		shell编程系列25--shell操作数据库实战之备份MySQL数据,并通过FTP将其传输到远端主机 备份mysql中的库或者表 mysqldump 常用参数详解: -u 用户名 -p 密码 -h ... 
- shell编程系列20--文本处理三剑客之awk常用选项
		shell编程系列20--文本处理三剑客之awk常用选项 awk选项总结 选项 解释 -v 参数传递 -f 指定脚本文件 -F 指定分隔符 -V 查看awk的版本号 [root@localhost s ... 
- shell编程系列19--文本处理三剑客之awk中的字符串函数
		shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ... 
随机推荐
- ##DAY11 UITableView编辑
			##DAY11 UITableView编辑 每一个视图控制器都有一个编辑按钮,因为项目中编辑的应用场景非常多,所以系统预留了一个编辑按钮供我们使用 self.navigationItem.leftBa ... 
- 0. chromium源代码分析 - 序
			本打算在CSDN写完这系列文字,却因为在CSDN中误删了一篇blog,该篇blog被移到了回收站.然而CSDN居然没有从回收站撤销删除的操作方法.联想到之前CSDN泄密的问题,其可靠性值得怀疑.随转向 ... 
- phpUnit 断言
			转自http://blog.163.com/qianxue126@126/blog/static/162723138201119113131125/ 布尔类型assertTrue 断言为真asse ... 
- vcredist作用
			一.vcredist作用: vcredist_x86.exe是微软公司Visual C++的32位运行时库,包含了一些Visual C++的库函数. vcredist_x64.exe是微软公司Visu ... 
- android小知识之圆角ListView
			有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈.甚至,有时觉得设计之殇是审美疲劳.直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中 ... 
- 成都Uber优步司机快速注册攻略(外地车牌也可加入,不用现场培训)
			我加入Uber司机有一段时间了,有一些经验和感想分享给大家,让大家少走些弯路.目前加入优步不收取任何费用,不需要抢单,时间安排自由灵活,使用便捷,深受大众喜爱. 加入人民优步拼车条件:购买运行5年之内 ... 
- mysql 的卸载、再安装与常用命令
			1.卸载mysql.完全删除: 删除 mysqlsudo apt-get autoremove --purge mysql-server-5.0sudo apt-get remove mysql-se ... 
- Linux 进程通信之 ——信号和信号量总结
			如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存. 所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ... 
- GridView行编辑、更新、取消、删除事件使用方法
			注意:当启用编辑button时,点击编辑button后会使一整行都切换成文本框.为了是一行中的一部分是文本框,须要把以整行的全部列都转换成模板,然后删掉编辑模板中的代码.这样就能使你想编辑的列转换成文 ... 
- .net-一般处理程序及生命周期
			IsReusable属性用来表示在IHttpHandlerFactory对象创建IHttpHandler的时候是否能够将这个Handler存入池中以便重用. 一般处理程序(HttpHandler):是 ... 
