有个B/S系统,一些任务页面上实在做不了,借助于本地客户端。ActiveX控件难写,也怕写得不稳定,于是就向操作注册自己的协议。
比如在地址栏或者“运行”里输入 http://tes.com就会打开网页浏览(不一定是IE,视系统设置),telnet://xxx.com就会打开telnet。那只要注册自己的协议,就可以页面上点击超链接打开自己的程序了。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\MoMo]
@="某某协议"
"URL Protocol"=hex(2):00,00
[HKEY_CLASSES_ROOT\MoMo\DefaultIcon]
@=" C:\\WINDOWS\\system32\\cmd.exe,0"
[HKEY_CLASSES_ROOT\MoMo\shell]
[HKEY_CLASSES_ROOT\MoMo\shell\open]
[HKEY_CLASSES_ROOT\MoMo\shell\open\command]
@="\"C:\\Program Files\\MoMoMo\\MoMo.exe\" \"%1\""
把上面的内容保存为x.reg,双击导入注册表就可以让系统在碰到MoMo://这关变态的地址时去打开MoMo.exe,并将整个MoMo://xxxx字符串传为命令行参数传递给MoMo.exe,如果是C语言写的,那就是argv[1]。
这样一来确实不错,“不需要装IE插件,不需要装Firefox插件”,就可以实现任务强大的功能。
但还是会有一个问题,这得在用户导入上面那个注册表,并且要下载那个可执行程序才行。并且,如果用户没有注册过这种协议,那访问这些MoMo://地址时就会是空白页面。
如何才能知道用户没有装过客户端(就是导入那注册表,下载那个MoMo.exe程序)呢?只有通过插件+Javascript了。
拿IE来说,
<script type="text/javascript">
var checker;
try {
checker=new ActiveXObject("HelloWorld.MoMo");
}catch(e){
}
//判断是否安装控件
if(checker==null)
{
document.write("<p style=\"color:red;background-color:yellow;font-weight:bold;\">请<a href=\"/client.exe\">点击这里</a>安装/升级客户端!</p>");
}
</script>
可以写一个空的IE ActiveX插件,什么功能也没有,什么事也不做,放在安装包client.exe里。页面上放上上面这段Javascript代码。 如果发同这个什么事也不做的ActiveX实例化失败,则说明用户没有装过客户端。这个时候可以把那些MoMo://链接的地址换成空的或者提示页面。
像下面的代码实现的效果就是,如果插件未装,就让用户在点击这些MoMo://链接的时候弹出提示框。(以下的语句需要JQuery的支持。)
//判断是否安装控件
if(checker==null)
{
$("#xxx_Link_id").attr("href","javascript:;");
$("#xxx_Link_id").click(function(){ alert("请下载并安装客户端.") });
$("#xxx_Link_id").click(function(){ alert("请下载并安装客户端.") });
}
这样基本上满足当前需求了。