HTML调用本地EXE程序

方法1-ActiveXObject

1
2
3
4
5
6
7
8
9
10
11
12
<script language="javascript">          
function RunExe(){
w = new ActiveXObject("WScript.Shell");
w.run('notepad.exe e:/a.bat');
return true;
}
</script>
<form id="form1">
<div>
<input type="button" value="Run" onclick="return RunExe()" />
</div>
</form>

简单但是不通用,只支持IE

方法2-URIScheme

创建流程:

CMD -> regedit
选中HKEY_CLASSES_ROOT右击 -> 新建 项 -> myprotocol
选中myprotocol右击 -> 新建 项 -> DefaultIcon
选中myprotocol右击 -> 新建 项 -> Shell
选中myprotocol右击 -> 新建 字符串值 -> URL Protocol
选中DefaultIcon -> 修改默认 值为C:\windows\notepad.exe
选中Shell右击 -> 新建 项 -> open
选中open右击 -> 新建 项 -> command
选中command右击 -> 修改默认 值为C:\windows\notepad.exe %1

导出的结果如下:

myprotocol.regview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\myprotocol]
@="ZM Protocol"
"URL Protocol"="E:\\test.bat %1"

[HKEY_CLASSES_ROOT\myprotocol\DefaultIcon]
@="C:\\Windows\\notepad.exe"

[HKEY_CLASSES_ROOT\myprotocol\shell]

[HKEY_CLASSES_ROOT\myprotocol\shell\open]

[HKEY_CLASSES_ROOT\myprotocol\shell\open\command]
@="E:\\test.bat %1"

调用方法:
在浏览器中输入myprotocol://e:/a.bat/
提示错误的文件路径
这个是因为传入的参数错误,打印发现%1被设置为myprotocol://e:/a.bat/,而不是预想的e:/a.bat
因此需要处理传入的参数

1
2
3
4
5
6
7
rem e:/test.bat
@echo off
set arg=%1
set arg1=%arg:~13,-1%
echo %arg1%
start notepad %arg1%
rem pause

其中13是myprotocol://的长度
%arg:~13,-1%是取arg字符串的第13个~倒数第二个的子串

一切OK了
现在html中简单一行就可以调用了
<a href="myprotocol://e:/a.bat/">打开a.bat</a>

参考文档

  1. [https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx]
  2. [http://www.voidcn.com/article/p-ehydagiu-uv.html]
  3. [http://www.yihaomen.com/article/other/212.htm]
  4. [http://www.jb51.net/article/37278.htm]