<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/web-page-call-exe-with-protocol/</link>
<title><![CDATA[网页中通过协议实现调用exe文件]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Wed, 31 Aug 2011 15:35:07 +0000</pubDate> 
<guid>https://www.heckjj.com/web-page-call-exe-with-protocol/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp; <span style="font-family: 微软雅黑;">基于浏览器的应用，表现力始终不够丰富，我们常常会想，在一个网页中，点一下某个链接，能够直接调用安装好的可执行程序有多好啊。按照微软的推荐，应该是通过ActiveX，把可执行程序嵌入到网页中，例如flash的ActiveX。这样，我们就要购买ActiveX的签名，不通过签名的东西，在IE6中是无法加载的，为一个小项目购买ActiveX的签名，代价太昂贵了。另外，很多时候还要考虑如果用户突然关闭了浏览器该怎么办。这对播放个flash、歌曲之类的没多大影响，但是很多时候，不能在关闭前清扫战场，带来的后果是灾难性的。通常，在企业应用中，我们总是通过IE直接调用exe。<br/>&nbsp;&nbsp;&nbsp;&nbsp;最早的时候，从网页调用一个EXE是很简单的事情，一段javascript就可以了。但是，自从IE6开始，微软就不再允许这种“极不安全的行为”。这也是有道理的。没事就给你来个“format d:/q”，即使不这么恶劣，动不动就给你弹几百个notebook，也确实够恐怖的。浏览器不应该与操作系统有太多不必要的关联。<br/>&nbsp;&nbsp;&nbsp;&nbsp;拿javascript在IE6测试之后，我几乎放弃了直接调用exe的想法，直到有一天，看到了腾讯的实现方法。<br/>&nbsp;&nbsp;&nbsp;&nbsp;腾讯有一个在网页上面显示QQ状态的东西，点一下就能弹出一个对话框跟该QQ用户聊天（就是我blog左上方的那个Q我的小图标），而不会有任何警告。好神奇啊。注册表里面研究了一天，终于明白了怎么回事。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;在windows中，注册表中包含各种协议（http，ftp，telnet等）的信息，包含了默认打开方式的参数。试一下，从IE的地址栏中输入telnet://www.hecks.tk，出现什么了？弹出了一个命令行窗口，开始进行telnet操作。IE居然能完成这个，那么为什么就不能完成“telnet1://参数” 呢？<br/><br/>Windows Registry Editor Version 5.00<br/><br/>[HKEY_LOCAL_MACHINE&#92;SOFTWARE&#92;Classes&#92;rDelta]<br/>@=&quot;rDelta&quot;<br/>&quot;URL Protocol&quot;=&quot;C:&#92;&#92;PROGRA~1&#92;&#92;rDelta&#92;&#92;rDeltaCmd.exe %1&quot;<br/><br/>[HKEY_LOCAL_MACHINE&#92;SOFTWARE&#92;Classes&#92;rDelta&#92;DefaultIcon]<br/>@=&quot;%SystemRoot%&#92;&#92;system32&#92;&#92;url.dll,0&quot;<br/><br/>[HKEY_LOCAL_MACHINE&#92;SOFTWARE&#92;Classes&#92;rDelta&#92;Shell]<br/><br/>[HKEY_LOCAL_MACHINE&#92;SOFTWARE&#92;Classes&#92;rDelta&#92;Shell&#92;open]<br/><br/>[HKEY_LOCAL_MACHINE&#92;SOFTWARE&#92;Classes&#92;Delta&#92;Shell&#92;open&#92;command]<br/>@=&quot;C:&#92;&#92;PROGRA~1&#92;&#92;rDelta&#92;&#92;rDeltaCmd &#92;&quot;%1&#92;&quot;&quot;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;把这个东西导入注册表，那么我们在浏览器中输入rDelta://1022,那么就会自动调用c:&#92;program files&#92;rDelta&#92;rDeltaCmd.exe（当然了，你得确实有这个文件），并把1022这个参数传给该exe。这个操作被认为是安全的，不会有任何的限制。<br/>&nbsp;&nbsp;&nbsp;&nbsp;到这里，思路就清晰了，我们的安装程序中，在注册表中建个协议，例如上面的rDelta，再把要执行的exe的路径信息写入，在网页直接一个超链接，协议://参数就可以了。exe文件接受这个参数，进行相应的处理。搞定。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;记住，协议://后面的所有字符串被看做是一个参数。那么，exe文件永远只有两个参数，参数0是它的完整执行路径，参数1就是网页传过来的字符串。</span> <span style="font-family: 微软雅黑;"><br/><br/>下面我再举个例子，其实和QQ一样，通过修改注册表，完成 <br/>---------------- <br/>Windows Registry Editor Version 5.00 <br/><br/>; 可复制修改多分以下内容在同一个文件中，配置多个exe调用 <br/><br/>[HKEY_CLASSES_ROOT&#92;justepExtCalc] <br/>&quot;URL Protocol&quot;=&quot;calc.exe&quot; <br/>@=&quot;justepExtCalcProtocol&quot; <br/><br/>[HKEY_CLASSES_ROOT&#92;justepExtCalc&#92;DefaultIcon] <br/>@=&quot;calc.exe,1&quot; <br/><br/>[HKEY_CLASSES_ROOT&#92;justepExtCalc&#92;shell] <br/><br/>[HKEY_CLASSES_ROOT&#92;justepExtCalc&#92;shell&#92;open] <br/><br/>[HKEY_CLASSES_ROOT&#92;justepExtCalc&#92;shell&#92;open&#92;command] <br/>@=&quot;&#92;&quot;calc.exe&#92;&quot; &#92;&quot;%1&#92;&quot;&quot; <br/><br/>如上自定义了协议名字 justepExtCalc, 这个协议与calc.exe 关联，即在浏览器中输入 justepExtCalc:&nbsp;&nbsp;就会调用calc.exe <br/><br/>如果需要添加调用另外一个 business.exe, 可以复制以上代码<br/>1)把所有justepExtCalc 替换成justepExtBusiness<br/>2)把所有calc.exe 替换成 business.exe <br/>3)用justepExtBusiness: 调用即可 <br/>4)在客户端导入此注册表文件 <br/><br/><br/>当有啦还有一种方式是通过js来调用的，但是高用的时候会提示安全警告，需要用户点击确认按纽。请看如下代码：</span><br/><textarea name="code" class="html" rows="15" cols="100">&lt;SCRIPT&nbsp;&nbsp;language=JavaScript&gt;&nbsp;&nbsp;
&nbsp;&nbsp;function&nbsp;&nbsp;Run(strPath)&nbsp;&nbsp;&#123;&nbsp;&nbsp;
&nbsp;&nbsp;exe.value=strPath;&nbsp;&nbsp;
&nbsp;&nbsp;try&nbsp;&nbsp;&#123;&nbsp;&nbsp;
&nbsp;&nbsp;var&nbsp;&nbsp;objShell&nbsp;&nbsp;=&nbsp;&nbsp;new&nbsp;&nbsp;ActiveXObject(&quot;wscript.shell&quot;);&nbsp;&nbsp;
&nbsp;&nbsp;objShell.Run(strPath);&nbsp;&nbsp;
&nbsp;&nbsp;objShell&nbsp;&nbsp;=&nbsp;&nbsp;null;&nbsp;&nbsp;
&nbsp;&nbsp;&#125;&nbsp;&nbsp;
&nbsp;&nbsp;catch&nbsp;&nbsp;(e)&#123;alert(&#039;找不到文件&quot;&#039;+strPath+&#039;&quot;(或它的组件之一)。请确定路径和文件名是否正确，而且所需的库文件均可用。&#039;)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&#125;&nbsp;&nbsp;
&nbsp;&nbsp;&#125;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;/SCRIPT&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;请输入要运行的程序： &lt;br&gt; &lt;input&nbsp;&nbsp;name=exe&nbsp;&nbsp;type=text&nbsp;&nbsp;size=30&nbsp;&nbsp;value=&quot;regedit&quot;&gt; &lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run 

(exe.value)&quot;&gt;确定 &lt;/BUTTON&gt; &lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=exe.value=&quot;&quot;;&gt;重新输入 &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;notepad&#039;)&quot;&gt;记事本 &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;mspaint&#039;)&quot;&gt;画图板 &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;calc&#039;)&quot;&gt;计算器 &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;cmd&#039;)&quot;&gt;cmd &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;Regedit&#039;)&quot;&gt;Regedit &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;Msconfig&#039;)&quot;&gt;Msconfig &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;D:&#92;Program Files&#92;Tencent&#92;QQ2010&#92;Bin&#92;QQ.exe&#039;&#039;)&quot;&gt;登陆QQ &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;IEXPLORE.EXE&#039;)&quot;&gt;IE浏览器 &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;..&#039;)&quot;&gt;.. &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;%windir%&#039;)&quot;&gt;%windir% &lt;/BUTTON&gt; &lt;br&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;BUTTON&nbsp;&nbsp;class=button&nbsp;&nbsp;onclick=&quot;Run(&#039;%temp%&#039;)&quot;&gt;%temp% &lt;/BUTTON&gt; 
</textarea><br/>Tags - <a href="https://www.heckjj.com/tags/%25E7%25BD%2591%25E9%25A1%25B5%25E8%25B0%2583%25E7%2594%25A8exe/" rel="tag">网页调用exe</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/web-page-call-exe-with-protocol/#blogcomment</link>
<title><![CDATA[[评论] 网页中通过协议实现调用exe文件]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/web-page-call-exe-with-protocol/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>