ATL & MFC 的结构化存储类






3.67/5 (12投票s)
2000年7月21日

129219

2206
一个封装了最常用的 IStorage 方法和 API 调用的类。
结构化存储是软件开发中一个有用的工具。它允许我们打开一个单一的二进制文件,并将其分成几个存储(可以嵌套)。每个存储可以有一个或多个流,用于写入和检索程序特定的信息。
所有这些功能都围绕着微软为 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 // CComPtrspIStr; ss.CreateStream(&spIStr, L"A stream"); CComBSTR bs(L"Some text to be written into the stream!"); bs.WriteToStream(spIStr); // // ...
背景信息
在这一点上,我必须说,该类的结构受到了 Andrew Peace 的文章和代码的启发。他的解决方案非常适合我,但不幸的是,由于以下原因,我发现它对我来说(当然是针对我的特定情况)没有用- Andrew 的解决方案使用
CString
和CList
,因此与 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" 文件中。
向量的front 和 back 是最重要的存储。 前者表示根存储,而后者表示当前存储。
相关文档
请参考 MSDN 库并搜索 IStorage, IStream, StgCreateDocfile, StgOpenStorage, ... 以获取更多详细信息。最后的 remarks
那些查看StructuredStorage.h
文件的人会注意到很多注释文本和有趣的命令。它们是 Doxygen 文档系统 所必需的。它是一个免费的文档实用程序,能够生成 HTML、HTML 帮助、LaTeX、RTF 等文档。
希望您会觉得这个类有用!