19

如果我创建一个新应用程序,并与特定计算机上的 .xml 文件扩展名相关联,当有人双击 .xml 文件时,它将启动我的应用程序并将文件作为参数传递。但 Windows 似乎知道哪些其他文件能够使用该文件类型。那是怎么设置的?

此外,当我将 Microsoft Word 文件另存为 .xml 文件,然后双击该文件时,它会启动 Microsoft Word,即使 .xml 文件类型与其他内容相关联,例如 Internet Explorer。似乎可能有一个与 .xml 文件类型关联的存根,当调用它时会查看内容并启动相应的应用程序。

是否有 Windows API 或某种标准方法来做到这一点?

我想要创建一个应用程序来完成 Word 正在做的事情——即以 .xml 格式保存文件,但是当双击时,会启动我的应用程序而不是 Internet Explorer。

4

3 回答 3

22

用于打开 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”文件不同?)。

于 2009-10-14T23:53:17.677 回答
3

好吧,所有文件关联都存储在注册表中。有一篇文章“了解 MS Windows 文件关联”可能会有所帮助。

除此之外,还有许多以编程方式创建文件关联的方法。尽管大多数情况下这是在安装程序中完成的。例如,我最喜欢的安装系统 NSIS 有一个宏来处理这个: http: //nsis.sourceforge.net/FileAssoc

但是设置默认程序以打开某种文件类型是一个挑战。我不知道您打算使用哪种语言或安装系统来执行此操作,但似乎NSIS 在这里回答了这个问题。当然,Microsoft 也有文档说明他们使用 Windows Installer 执行此操作的方式。但正如你可能猜到的,我更像是 NSIS 的人。;)

于 2009-10-14T21:37:35.213 回答
0

在 Windows 资源管理器中单击工具->文件夹选项->文件类型。通过单击“新建”或“高级”,您可以创建/更改您自己的应用程序与您右键单击文件时出现的各种文件类型的关联。

编辑:我不知道是否有重定向特定文件的存根。您可以在注册表中检查 My Computer\HKEY_CLASSES_ROOT 并查看其中的内容。

于 2009-10-14T21:31:47.383 回答