65.9K
CodeProject 正在变化。 阅读更多。
Home

ACF 扩展 Shell – 第一部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.92/5 (6投票s)

2004年5月27日

4分钟阅读

viewsIcon

35705

downloadIcon

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 库。它相当简单和基础,但可以作为您学习和使用该库的一个很好的起点。

参考

© . All rights reserved.