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.