在 MS Word 2003 文档中隐藏和存储/缓存应用程序特定数据






3.54/5 (8投票s)
概念验证,演示如何将应用程序特定数据(少量或大量)存储在 MS Word 文档中,以及如何使其对最终用户不可见。
引言
在本文中,我将介绍一种方法,说明如何将应用程序特定数据(少量或大量)存储在 MS Word 文件中,以及如何使其对最终用户不可见。类似的方法也可用于 MS Excel 和 MS PowerPoint 文件。
实现机制
用于实现上述目标的机制有:
1) 复合文件实现结构化存储(用于以隐藏形式存储应用程序特定数据)
2) VSTO 插件(用于在保存操作丢失应用程序特定数据后恢复它)
1) 复合文件实现结构化存储
复合文件格式和 MS Office 文件格式复合文件(OLE 复合文件)可以看作是文件中的文件系统,或者说是 OLE 结构化存储的基于文件的实现。它们允许您在单个文件中创建文件(称为流)和目录(称为子存储)。
有关复合文件的更多信息,请参阅以下链接:
http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/WindowsCompoundBinaryFileFormatSpecification.pdf"
OLE 复合文件已包含在 Windows API 中多年,用于支持 OLE 启用的应用程序,如 MS Word、Excel、PowerPoint 等。
这三种类型的文件(MS Word、MS Excel、MS PowerPoint)都有自己的复合文件格式。
Word、Excel 和 PowerPoint 的文件格式可以在以下链接中找到:
http://www.microsoft.com/interop/docs/OfficeBinaryFormats.mspx
注意:我们不需要理解这些复杂的文件格式。我们唯一需要知道的是复合文件的基本知识。即什么是存储和流。
要查看 msword、xls 和 ppt 文件中的内置存储和流,请从以下链接下载复合文件浏览器:http://www.coco.co.uk/developers/CFX.html
安装并运行复合文件浏览器。在复合文件浏览器中打开 MS Word 文件。它将显示其中的内置存储和流。同样,也可以在复合文件浏览器中打开 ppt 或 xls 文件以查看内置存储和流。
COM 提供结构化存储的标准实现,称为复合文件。复合文件具有以下优点:
数据隐藏
通过使用复合文件 API,我们可以在 msword、xls 和 PowerPoint 文件中创建自己的存储和流。当用户在相应应用程序中打开文档时,这些存储和流对用户不可见。文件系统和平台无关性
由于 COM 的复合文件实现运行在现有平面文件系统之上,因此存储在 FAT 文件系统、NTFS 文件系统或 Macintosh 文件系统中的复合文件可以被使用其他文件系统的应用程序打开。我在示例应用程序中使用了 IStorage-复合文件实现。IStorage 的复合文件实现允许您在位于复合文件对象中的存储对象内创建和管理子存储和流。要创建复合文件对象并获取 IStorage 指针,请调用 API 函数 StgCreateStorageEx。要打开现有复合文件对象并获取其根 IStorage 指针,请调用 StgOpenStorageEx。API 参考请查看以下 URL:
http://msdn.microsoft.com/en-us/library/aa380017(VS.85).aspx
使用这些 API,我成功地将应用程序特定数据添加到了 MS Word 文档中。在复制/发送 MS Word 文档时没有发现问题。
但仍然有一个问题
问题描述
我测试发现,如果在文件中进行了一些修改/添加/删除操作,然后保存文件,那么该应用程序特定数据就会从文件中删除。为了解决这个问题,我创建了 VSTO 插件,如下所述。
2) VSTO 插件
我为 MS Word 创建了 VSTO 插件。类似的插件也可以为 ppt 和 xls 文件创建。此插件会检查应用程序特定数据是否已被删除,然后将应用程序特定数据重新插入到 MS Word 文件中。基本上,使用插件,可以捕获 doc 文件中的各种事件。
同样,如果为 PowerPoint 和 Excel 应用程序创建插件,那么在安装了这些插件之后,您将能够捕获 Excel 和 PowerPoint 文件中的各种事件。Visual Studio Tools for Office 使您能够创建应用程序级别的插件。
应用程序级别的插件由托管代码程序集组成,该程序集在 Microsoft Office 应用程序中作为插件运行。使用 Visual Studio Tools for Office 创建的插件可以访问 Microsoft .NET Framework 以及应用程序的对象模型。构建插件项目时,Visual Studio 会将程序集编译成 .dll 文件,并创建一个单独的应用程序清单文件。
Visual Studio Tools for Office 提供了一个加载程序,用于加载使用 Visual Studio Tools for Office 创建的插件。当用户启动 Microsoft Office 应用程序时,此加载程序会启动公共语言运行时 (CLR) 和 Visual Studio Tools for Office 运行时,然后加载插件程序集。该程序集可以捕获应用程序中引发的事件。在 VSTO Addin 解决方案中,您可以执行以下操作:
响应应用程序本身引发的事件(例如,当用户单击菜单项时)。
我检查了 Office 文件的打开、保存和关闭事件,并借助这些事件实现了在保存操作丢失应用程序特定数据后重新插入该数据的解决方案。
因此,复合文件 API 和 VSTO 插件共同提供了问题的解决方案。
源代码组织
本文提供的概念验证 (poc) 代码具有以下组织结构:
Proof Of Concept -FileStorage -> MFC Regular dll that uses Compound file Implementation of structured storage for storing DocumentId(application specific data) in hidden form.
-Document Reader ->C# console application which calls FileStorage dll to insert and retrieve DocumentID in ms officefile(doc,xls,or ppt file).
-WordAddIn1 -> It is VSTO addin which captures the ms word events.
-SocketServer ->It is c# exe that implements asynchronous socket server which reinserts the DocumentID after it is lost.
-Common ->C# assembly which implements asynchronous client to send the request to SocketServer
Using the Code
- 在 MS Word 中添加 DocumentID(对最终用户隐藏)
1. 打开 \Proof Of Concept\FileStorage 项目,并在发布模式下构建 FileStorage dll。2. 将 \Proof Of Concept\FileStorage\release\FileStorage.dll 复制到 \windows\system32
3. 打开 \Proof Of Concept\DocumentIDReader 项目,构建并运行它。
4. 它会显示一个带有三个按钮的窗体:Browse、AddDocumentID 和 Read DocumentID。
5. 使用 Browse 按钮选择一个 MS Word 文件,例如“file1.doc”。
6. 单击 Add DocumentID 按钮将 DocumentID 插入到 file1.doc 中。
如果 ID 嵌入成功,则会显示“DocumentID added”消息。
7. 现在单击 Read DocumentID 按钮,它将显示插入到 MS Word 文档中的文档 ID。
8. 现在打开 file1.doc,您会发现文档 ID 对用户是隐藏的。
- MS Word 保存操作时 Document ID 丢失
9. 现在在 MS Word 应用程序中打开 file1.doc,在此文件中键入一些文本,然后单击保存按钮。10. 关闭 file1.doc 文件,然后再次运行 DocumentIDReader 应用程序并选择 file1.doc。
11. 单击 Read DocumentID 按钮,它将显示“DocumentID not found.”。
防止 MS Word 保存操作时“文档 ID 丢失”
12. 打开 \Proof Of Concept\Common 项目,并构建此 c# 程序集。13. 打开 \Proof Of Concept\SocketServer 项目,并删除对名为“Common”的 c# 程序集的现有引用。
14. 将新构建的“Common”c# 程序集引用添加到 SocketServer。
15. 现在构建 SocketServer 项目并运行 SocketServer exe。
16. 打开 \Proof Of Concept\WordAddIn1 项目,并删除对名为“Common”的 c# 程序集的现有引用。
17. 将新构建的“Common”c# 程序集引用添加到 WordAddIn1 项目。
18. 在调试模式下构建 WordAddIn1。现在使用 Debug 菜单 Debug->Start debugging 运行 Word Addin 应用程序。
19. 运行此插件时,它会打开一个新的空白文档。现在打开一个 Word 文件,编写一些数据,然后关闭 MS Word 应用程序(无论是否保存)。
现在也关闭 document1。
20 关闭文档时,可能会显示以下消息:
此文件正被另一个应用程序或用户使用。如果显示上述消息,请单击消息框上的“确定”按钮。单击“确定”后,会显示“另存为”对话框。现在单击“取消”按钮。
21.现在关闭 MS Word 应用程序。
关闭 MS Word 应用程序时,可能会显示以下消息:
“已进行更改,影响了全局模板 Normal.dot。是否要保存这些更改?”
如果显示上述消息,请单击“否”。
步骤 20 和步骤 21 中显示的警告消息可能仅在首次/全新安装 Word Addin 时出现。之后将不会显示这些警告消息。
22.现在 Word Addin 已安装在系统中。
23. 现在使用 \Proof Of Concept\DocumentIDReader 项目将文档 ID 插入到 file1.doc 中。
24.确保 socketserver exe 正在运行。
25.现在打开 file1.doc。对其进行一些修改,保存然后关闭 file1.doc。
26. 使用 \Proof Of Concept\DocumentIDReader 项目从 file1.doc 读取 doumentID。
27.现在您将看到文档 ID 没有从 file1.doc 中丢失。
卸载 Word Addin
如果在测试后想从系统中删除 Word Addin,请按照以下步骤操作:1.打开注册表
2.搜索 WordAddin1
从注册表中删除“WordAddin1”条目。>
这将从系统中删除该 Addin。
关于贡献者
此概念验证由 NEC HCL System Technologies Ltd(印度)的中间件解决方案组负责人 Alok Srivastava 先生监督,由 Vinita Batra 和 Atul Suyal 开发。您可以访问我们的网站 http://www.nechclst.in
历史
第一个版本。未来的版本将基于收到的评论/建议。
关于作者
Vinita Batra
职业:软件工程师
公司:NEC HCL System Technologies Ltd
地点:4th Floor, Tower B, Logix Technopark Sector 127, Noida 201301
公司:NEC HCL System Technologies Ltd
地点:4th Floor, Tower B, Logix Technopark Sector 127, Noida 201301