和 Shell 打交道的两点经验

写了一个 Shell Tree 控件,在测试中发现有两个问题:
1、当遍历到控制面板中的“便携媒体设备”时,总会得到四个子结点,而每个子节点又有四个子结点,如此可到无穷。
2、如果系统中存在两个用户,假设名字为“dandy”和“oldman”,则以 dandy 登录后,在“我的电脑”中这两个用户的文档目录显示的名字与资源管理器不同,资源管理器中的名字分别为“dandy 的文档”和“oldman 的文档”,而我的控件中显示的是“My Documents”和“oldman 的文档”。

经过调试,发现了问题所在。对于问题 1,是因为没有调用 CoInitialize() 函数。但为什么遍历其他的位置没有问题就不得而知了;至于问题 2,是因为在调用 IShellFolder::GetDisplayNameOf() 方法时,没有指定标志 SHGDN_INFOLDER。所以,如果有别的人要写 Shell Tree,希望不要贪图一时简便调用 SHGetFileInfo() 函数,因为此函数没有接受此标志的参数,还是老老实实调用 SHBindToParent() 和 IShellFolder::GetDisplayNameOf() 吧。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注