如果我创建一个新的应用程序,并与特定计算机上的 .xml 文件扩展名相关联,当有人双击 .xml 文件时,它将启动我的应用程序并将该文件作为参数传递。但 Windows 似乎知道哪些其他文件能够处理该文件类型。这是如何设置的?
此外,当我将 Microsoft Word 文件另存为 .xml 文件,然后双击该文件时,它将启动 Microsoft Word,即使 .xml 文件类型与其他文件相关联,例如 Internet Explorer .似乎可能有一个与 .xml 文件类型关联的 stub ,当调用它时会查看内容并启动适当的应用程序。
是否有 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.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 文档中的处理指令显示特定图标:icon handler。 .
图标处理程序是一种 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 格式(参见 Why do Office ".xml" files behave differently from other ".xml" files?)。
关于windows - 如何将 Windows 应用程序与特定文件类型相关联,但与其他应用程序共享该关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569102/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序