此外,当我将Microsoft Word文件保存为.xml文件时,然后双击该文件,即使.xml文件类型与其他内容(例如Internet Explorer)相关联,它也将启动Microsoft Word.似乎可能有一个与.xml文件类型相关联的存根,当被调用时会查看内容并启动相应的应用程序.
有没有Windows API,还是某种标准的方法呢?
我想要创建一个应用程序来完成Word正在做的工作 – 即以.xml格式保存文件,但是当双击时,启动我的应用程序而不是Internet Explorer.
对于以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.Document的CurVer子项的另一个重定向到Word.Document12(如果安装了Office 2007),那么我们最终得到:
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文档中的处理指令,另一种机制负责显示一个特定的图标:一个icon handler.
图标处理程序是一种Explorer Shell扩展,它们是可与某些文件类型相关联的进程内COM对象.用于XML文件的文件在注册表中指定
HKEY_CLASSES_ROOT\xmlfile\ShellEx\IconHandler = "{AB968F1E-E20B-403A-9EB8-72EB0EB6797E}"
这个GUID是指MSOXEV.dll,它将类似于MSOXMLEX.EXE检查ProgId的XML文件,然后提供正确的图标.
由于所有这些都是一个相当复杂的机制,您应该仔细考虑,如果你想这样做.在我看来,注册新的唯一文件扩展名要简单得多.它也受到限制,因为它只适用于允许您在文件标题中包含某些自定义信息(如ProgId)的文件类型.
Microsoft不再使用此方法,而是使用文件扩展名替换新的OpenXML格式(参见Why do Office “.xml” files behave differently from other “.xml” files?).