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

ATL & MFC 的结构化存储类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (12投票s)

2000年7月21日

viewsIcon

129219

downloadIcon

2206

一个封装了最常用的 IStorage 方法和 API 调用的类。

  • 下载演示项目 - 12 Kb
  • 下载源代码 - 8 Kb
  • 结构化存储是软件开发中一个有用的工具。它允许我们打开一个单一的二进制文件,并将其分成几个存储(可以嵌套)。每个存储可以有一个或多个流,用于写入和检索程序特定的信息。

    所有这些功能都围绕着微软为 Windows 操作系统提供的 COM 对象构建。我们通过 IStorage 和 IStream 接口以及几个 API 函数调用来访问它。然而,这是一项繁琐的工作,我决定围绕这些接口和 API 调用编写一个轻量级的封装器。

    一个简短的例子

    以下代码快照展示了类的实际应用……
    StructuredStorage ss;
    //
    // Let's create a file. This also creates the root storage.
    //
    ss.CreateFile(L"SSTest.bin");
    //
    // Let's create a storage on the root one.
    //
    ss.CreateStorage(L"FirstLevel");
    //
    // Create a stream and write to it
    //
    CComPtr spIStr;
    ss.CreateStream(&spIStr, L"A stream");
    CComBSTR bs(L"Some text to be written into the stream!");
    bs.WriteToStream(spIStr);
    //
    // ...
    

    背景信息

    在这一点上,我必须说,该类的结构受到了 Andrew Peace 的文章和代码的启发。他的解决方案非常适合我,但不幸的是,由于以下原因,我发现它对我来说(当然是针对我的特定情况)没有用
    • Andrew 的解决方案使用 CStringCList,因此与 MFC 库绑定。 我们需要在 COM 控件中使用结构化存储功能,因此不需要链接到 MFC。
    • 仔细看看他的代码,可以看到他使用了几个冗余的变量,这不必要地使代码复杂化。
    • 有时(虽然很少),我们需要知道接口调用或函数调用失败的原因。

    尽管我的解决方案消除了上述缺点,但它增加了一些新的缺点

    • 我正在使用 STL vector 容器。 一些人试图避免在他们的 COM 对象中使用 STL 容器。
    • 如果该解决方案在标准的 MFC 项目中使用,则需要支持 CComBSTR 类(在 "ATLBase.h" 中定义)。 同样,一些人不喜欢在 MFC 代码中使用这个头文件。
    • 结构化存储管理的高级功能尚未提供。

    实现信息

    该类围绕着一个 IStorage 对象向量构建。(IStorage 对象 == 存储,存储向量 == 容器)向量的第一个元素表示根存储,后续元素表示子存储。 我们可以说,存储向量代表从根存储到最后一个存储(当前存储)的路径。例子
    • [0] = 根存储(级别 0,不一定是文件的根)。
    • [1] = 根存储中的存储(级别 1)。
    • [2] = 级别 1 存储中的存储(级别 2)
    • [n] = 级别 n 的当前存储(容器的最后一个元素)。

    如果根存储也是结构化文件的根,例如 "C:\test\StructFile.bin",级别 1 是 "Level 1",级别 2 是 "Level 2",... 那么当前存储的路径是

    "C:\test\StructFile.bin|Level1|Level2|...|LevelN"

    竖线 | 用于强调存储之间的分界线。 请注意,路径 "Level1|Level2|...|LevelN" 的一部分隐藏在 "StructFile.bin" 文件中。

    向量的frontback 是最重要的存储。 前者表示存储,而后者表示当前存储。

    相关文档

    请参考 MSDN 库并搜索 IStorage, IStream, StgCreateDocfile, StgOpenStorage, ... 以获取更多详细信息。

    最后的 remarks

    那些查看 StructuredStorage.h 文件的人会注意到很多注释文本和有趣的命令。它们是 Doxygen 文档系统 所必需的。它是一个免费的文档实用程序,能够生成 HTML、HTML 帮助、LaTeX、RTF 等文档。

    希望您会觉得这个类有用!

    © . All rights reserved.