用于打开 Office .xml 文档的机制
对于以 XML 格式保存并具有 .xml 扩展名的 Word 文档,Microsoft 实施了一个特殊的处理程序来在相应的应用程序中打开这些文件(该机制不仅用于 Word 文档,还用于 Excel 电子表格、InfoPath 表单和一些其他格式)。
如果您检查注册表,您将看到扩展名为 .xml 的文件的文件类型设置为xmlfile
:
HKEY_CLASSES_ROOT\.xml (Default) = "xmlfile"
打开此文件类型时执行的命令在下面指定
HKEY_CLASSES_ROOT\xmlfile\shell\open\command = ""C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSOXMLED.EXE" /verb open "%1""
因此,当在资源管理器中双击 XML 文件时,Windows 将启动 MSOXMLED.EXE。此应用程序现在正在查看 XML 文件并搜索 XML 处理指令。这个名为mso-application的处理指令可以指定一个 ProgId:
<?mso-application progid="Word.Document"?>
如果找到此处理指令并且 ProgId 是受支持的值之一,MSOXMLED.EXE 将在注册表中搜索为该 ProgId 指定的打开命令。对于Word.Document,实际上还有另一个重定向到Word.Document12(如果安装了 Office 2007)使用 Word.Document 的 CurVer 子键,所以我们最终得到:
HKEY_CLASSES_ROOT\Word.Document.12\shell\Open\command = ""C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /n /dde"
所以最后 MSOXMLED.EXE 将启动适当的 Office 应用程序或启动在下面指定的默认 XML 应用程序
HKEY_CLASSES_ROOT\XEV.GenericApp\shell\open\command
实际上,您可以通过从命令行调用 MSOXMLED.EXE 来尝试一下:
MSOXMLED.EXE /verb OPEN "SampleWordMLDocument.xml"
如果您想实现相同的行为,则必须实现一个处理程序,如 MSOXMLED.EXE,它在文件内部查找预定义的处理指令,然后将文档路由到适当的应用程序。
图标处理
上面我们查看了文档打开和编辑的处理方式。另一种机制负责根据 XML 文档中的处理指令显示特定图标:图标处理程序。
图标处理程序是一种 Explorer Shell 扩展,它是可以与某些文件类型相关联的进程内 COM 对象。用于 XML 文件的文件在注册表中指定
HKEY_CLASSES_ROOT\xmlfile\ShellEx\IconHandler = "{AB968F1E-E20B-403A-9EB8-72EB0EB6797E}"
此 GUID 指的是 MSOXEV.dll,它将类似于 MSOXMLEX.EXE 检查 XML 文件中的 ProgId,然后提供正确的图标。
由于所有这些都是一个相当复杂的机制,如果你想走这条路,你应该仔细考虑。在我看来,注册一个新的唯一文件扩展名要简单得多。它也受到限制,因为它仅适用于允许您在文件头中包含一些自定义信息(如 ProgId)的文件类型。
Microsoft 不再使用此方法,而是将文件扩展名用于新的 OpenXML 格式(请参阅为什么 Office“.xml”文件的行为与其他“.xml”文件不同?)。