ACF 扩展 Shell – 第一部分






3.92/5 (6投票s)
2004年5月27日
4分钟阅读

35705

342
本文介绍了一个基于 ACF 构建的微型 Shell 库,它能让 Shell 编程变得轻而易举。

引言
Shell 编程是 Windows 编程中最具挑战性的任务之一。开发者需要处理神秘的 PIDL、IShellFolder 以及一些 Shell 函数;开发和调试过程可能非常困难。本文介绍了一个基于 ACF (Another C++ Framework) 构建的微型 Shell 库,它能让 Shell 编程变得轻而易举。
如果您不熟悉 ACF,请访问 ACF 主页 (SourceForge),或查看 CodeProject 上的 另一篇文章。
入门
首先,您需要构建 WinShell 库,并在您的开发环境中设置包含和库目录。由于这个过程与其他 ACF 库(例如 Corlib)类似,这里不再赘述。
第一个示例是显示桌面文件夹中的项目。您现在可以回忆一下如何使用 PIDL 和 IShellFolder 来实现这一点。
下面是使用 ACF 和 WinShell 库的代码,我相信它比您想象的要简单得多。
#define _WIN32_DCOM #include <objbase.h> #include <AcfCorlib.h> #include <AcfWinShell.h> using namespace Acf; using namespace Acf::Windows::Shell; int main() { ::CoInitializeEx(null, COINIT_APARTMENTTHREADED); ItemPtr desktop = Item::get_Desktop(); FOREACH (ItemPtr, item, desktop) { Console::WriteLine(item->DisplayName); } ::CoUninitialize(); }
Item 类代表 Shell 命名空间中的一个对象(可以是文件夹或非文件夹)。它包含支持导航 Shell 命名空间和检索项目信息的属性和方法。由于它实现了 IEnumerable<T>,您可以使用 FOREACH 循环遍历它。
现在,让我们看另一个示例。此示例演示了如何获取“我的电脑”的子文件夹,然后对其进行排序。您是否曾相信这一切只需几行代码就能完成? :-)
ItemPtr folder = new Item(SpecialFolder::MyComputer); RefPtr<IEnumerable<ItemPtr> > c = folder->Folders; RefPtr<List<ItemPtr> > list = new List<ItemPtr>(c); list->Sort();
正如您所见,这里使用的概念和模型与其他 ACF 部分一样。开发者应该会感到轻松和舒适。
由于 Item 类是实现魔法的关键,让我们详细看看它。
类 Item
代表 Shell 命名空间中的一个对象。
class Item : public Object, public IEnumerable<ItemPtr>
命名空间:Acf::Windows::Shell。
构造函数
- Item(SpecialFolder s);- 使用 - SpecialFolder枚举(例如- SpecialFolder::MyComputer)之一初始化新实例。
- Item(String* path);- 为指定的文件初始化新实例。 
属性
- static ItemPtr get_Desktop();- 获取桌面 Item。 
- ItemPtr Parent;- 获取当前对象的父对象。 
- StringPtr DisplayName;- 获取对象的显示名称。例如,“我的电脑”。 
- StringPtr ParsingName;- 获取对象相对于桌面的解析名称。例如,“C:\\Windows”。 
- StringPtr RelativePath;- 获取对象相对于父文件夹的名称。 
- bool IsDesktop;- 获取一个值,指示此对象是否为桌面。 
- bool IsFolder;- 获取一个值,指示对象是否为文件夹。 
- bool IsFileSystem;- 获取一个值,指示对象是否为文件系统的一部分。 
- StringPtr FileSysPath;- 获取对象的完整路径。如果对象不是文件系统的一部分,则会抛出异常。 
- RefPtr<IEnumerable<ItemPtr> > Folders;- 获取对象的子文件夹。如果此对象不是文件夹,则会抛出异常。 
- RefPtr<IEnumerable<ItemPtr> > NonFolders;- 获取对象的子非文件夹。如果此对象不是文件夹,则会抛出异常。 
- const ITEMIDLIST* Pidl;- 获取对象的相对 PIDL。 
- const ITEMIDLIST* FullPidl;- 获取对象的完整 PIDL。 
- int ImageIndex;- 获取对象的系统图像列表索引。 
方法
- static int Compare(Item* a, Item* b);- 比较两个项。如果两个项不在同一个文件夹中,则会抛出异常。 
- virtual RefPtr<IEnumerator<ItemPtr> > GetEnumerator();- 返回一个枚举器。 
- RefPtr<IEnumerable<ItemPtr> > GetChildItems(ChildItemType typeFlags);- 返回指定类型的子项。如果此对象不是文件夹,则会抛出异常。 
- RefPtr<IEnumerable<ItemPtr> > GetChildItems(HWND hwndOwner, ChildItemType typeFlags);- 返回指定类型的子项。如果此对象不是文件夹,则会抛出异常。窗口句柄用于显示对话框或消息框(例如,在枚举没有磁盘的光驱时,系统会提示用户插入磁盘)。 
- RefPtr<IEnumerable<ItemPtr> > GetFolders(HWND hwndOwner);- 返回对象的子文件夹。如果此对象不是文件夹,则会抛出异常。 
- RefPtr<IEnumerable<ItemPtr> > GetNonFolders(HWND hwndOwner);- 返回对象的子非文件夹。如果此对象不是文件夹,则会抛出异常。 
- ItemPtr GetChild(String* relativeParsingName);- 返回具有指定相对解析名称的子项。如果此对象不是文件夹,则会抛出异常。 
- ItemPtr GetChild(HWND hWnd, String* relativeParsingName);- 返回具有指定相对解析名称的子项。如果此对象不是文件夹,则会抛出异常。 
- ItemAttributes GetAttributes(ItemAttributes mask);- 返回对象的属性。mask 参数指定要返回的位。 
关于演示
演示是一个类似 Explorer 的 MFC 对话框应用程序,展示了如何使用本文介绍的 Shell 库。它相当简单和基础,但可以作为您学习和使用该库的一个很好的起点。
参考
- ACF:SourceForge
- Windows Shell:参见 MSDN
- Longhorn SDK Windows Explorer.
