前言

这几天有个需求,需要在IE上启动本地程序,就如下面一样。

一开始,我还以为IE有提供特殊的接口,类似上图中的“RunExe”,可以找了大半天觉得不对经(找不到该方法)。

后来想想不对,这种方式是ActiveX控件。

ActiveX控件基本概念

ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行。这个容器包括WEB网页,应用程序窗体等。

ActiveX控件的后缀名是OCX或者DLL。一般是以OCX和动态库共存的形式打包成cab或者exe的文件放在服务器上,客户端下载后运行安装cab或exe解压成OCX和动态库共存的文件,然后注册ocx文件。

ActiveX控件是基于com标准,使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序,此外ActiveX一般具有界面。

PS:使用ActiveX需要设置IE的安全级别,Internet选项-->安全-->自定义级别--> 对没有标记为安全的ActiveX控件进行初始化和脚本运行—>启用。

结论

所以就如启动QQ、迅雷,根本就不是用ActiveX控件,严格上讲,ActiveX控件已经是实现业务逻辑的可视化界面(类似Chrome的拓展程序),所以这种方式被抛弃,因为我是要启动本地一个程序,而不是一个“插件”。

自定义协议

就如果迅雷和QQ,可以用类似tencent://message,直接在页面启动程序。

做法:

Windows:在注册表添加一个新的key以及相关的value到HKEY_CLASSES_ROOT中,来使应用程序可以处理特殊的URL协议。

Mac:注册URL Scheme。当用户在浏览器中访问你的自定义URL Scheme的链接的时候,操作系统就会打开你的程序,响应这个请求。
实现:
Windows
1.把以下内容记在文本中,并重命名为xxx.reg,双击运行。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\BingoLink]
@="URL:BingoLink Protocol"
"URL Protocol"="C:\\Program Files (x86)\\BingoSoft\\BingoLink\\BingoLink.exe" [HKEY_CLASSES_ROOT\BingoLink\DefaultIcon]
@="C:\\Program Files (x86)\\BingoSoft\\BingoLink\\BingoLink.exe,1" [HKEY_CLASSES_ROOT\BingoLink\shell]
@="open" [HKEY_CLASSES_ROOT\BingoLink\shell\open]
@="open" [HKEY_CLASSES_ROOT\BingoLink\shell\open\command]
@="\"C:\\Program Files (x86)\\BingoSoft\\BingoLink\\BingoLink.exe\" \"%1\""
PS:当然真正做时,这些注册表信息是需要在安装过程中添加的,而不是像我后面加。
2.测试例子
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body >
<a href="BingoLink://login?loginticket=11223344">点击这里启动程序</a>
</body>
</html>
Mac
由于Mac的原生桌面程序我并没涉猎,但是查看QQ的info.plist,也知道是注册URL Scheme。
优点:
1.各种浏览器都支持,mac和windows都可以做。
2. 不会有安全性问题。 

附录

1.js启动本地程序。

var wsh = new ActiveXObject("WScript.shell");
var path = wsh.RegRead("HKEY_CLASSES_ROOT\\BingoLink\\URL Protocol") + " --sign=11223344";
wsh.exec(path); //用run是不行的

参考文献

1.http://blog.csdn.net/qq_25867649/article/details/52189412 【ActiveX控件】

2.http://blog.csdn.net/jackychen_king/article/details/7743811 【通过自定义URL协议在Web中启动本地应用程序】

3.http://cocoa.venj.me/blog/custom-url-scheme-on-mac-and-ios/

Windows和Mac浏览器启动本地程序的更多相关文章

  1. Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..

    Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid Ap ...

  2. 使用浏览器自定义协议启动本地程序(.EXE文件)

    比如,自定义协议名称为 myapp,要启动的本地程序为 myapp.exe. 1)首先向注册表添加如下内容: Windows Registry Editor Version 5.00 [HKEY_CL ...

  3. 从浏览器启动应用程序 - Application URL

    关键字:Browser,Application,URL Protocol,Windows,Mac,IE,Chrome,Safari. OS: Windows 7, OS X Yosemite. Win ...

  4. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序

    本教程适用于Windows系统 从浏览器上打开本地程序,主要用到了本地URL协议,其实主要就是改注册表 先建立一个项目,我建的是控制台项目 在Program.cs写2个静态方法用来添加注册表.移除注册 ...

  5. 如何通过写一个chrome扩展启动本地程序

    @(编程) [toc] 本文介绍如何利用Chrome 的插件, 从我们的一个网站中启动一个我们的本地程序.本文的环境是windows10,本文的例子是通过点击网页上的一个button,调用本地的wor ...

  6. Android 浏览器启动应用程序

    点击浏览器中的URL链接,启动特定的App. 首先做成HTML的页面,页面内容格式如下: <a href="[scheme]://[host]/[path]?[query]" ...

  7. 在 Windows 中使用 C# 启动其他程序

    因为某些原因需要自动启动一个 Winform 程序,可能是因为第三方资源的原因,使用 System.Diagnostics.Process 无法成功启动 (可以看到界面,但是会报 Unhandled ...

  8. 【转载】Chrome使用自定义协议打开本地程序并运行IE打开网页

    部分内容转载自: http://blog.sina.com.cn/s/blog_e2b8213a0102wqby.html 项目中遇到某需求:chorme要运行IE并打开网页.解决方案之一就是通过自定 ...

  9. 实现chrome扩展启动本地进程 - 补充

    实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘 2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报  分类: Chrome Plu ...

随机推荐

  1. bash中通过设置PS1变量改变提示符颜色

    参考 <Prompt Magic> ubuntu初始时bash提示符的颜色同程序输出的颜色相同,当大量有输出时,找到输出信息开始的地方往往很费劲.如果把提示符的颜色变成更为醒目的颜色,那么 ...

  2. Extjs 项目中常用的小技巧,也许你用得着(1)

    我在项目中遇到的一些知识点: 1.在GridPanel中显示图片,效果 对应的代码实现 { text: '是否启用', width: 80, // xtype: 'checkcolumn', data ...

  3. 修改mysql忽略大小写

    mysql -p --1.登录mysql show variables like "%case%";+------------------------+-------+| Vari ...

  4. Ocelot中文文档-Route

    路由(Routing) Ocelot主要功能是接收即将发来的请求并转发它们至下游服务.与此同时,以另一个http请求的形式(在将来这可能是任何传输的机制) Ocelot将一个请求的路由描述为另一个路由 ...

  5. 2.C++中的bool类型,三目运算符,引用

    本章主要内容: 1)bool类型 2)三目运算符 3)引用 1.布尔型bool 在C++中,bool类型只有true(非0)和flase(0)两个值,且bool类型只占用了一个字节. 例如: #inc ...

  6. 【开发工具之eclipse】8、The word is not correctly spelled。强迫症看着很难受

    eclipse出现了极其让我郁闷的错误,"The word is not correctly spelled" 我讨教过一些朋友以后,还是没有得到答案,我就纳闷了.然后我继续将代码 ...

  7. Why is one loop so much slower than two loops?

    Question: Suppose a1, b1, c1, and d1 point to heap memory and my numerical code has the following co ...

  8. linux学习笔记-安装配置使用clamav杀毒软件

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装clamav 2.更新病毒库 # freshclam 如果更新不了,或者更新特别慢,可以手动下载病毒库文件,放到/var ...

  9. js之模态对话框

    目标效果:点击页面按钮,显示模态对话框,在模态对话框里点击取消关闭模式对话框. 效果如下 实现代码如下: <!DOCTYPE html> <html lang="en&qu ...

  10. 微信小程序request同步请求

    今天在搞微信小程序的时候顺手用了async,await死活不起作用,后来查了一下子,竟然不支持,那没办法就换了一种实现wx.request同步请求的方案 祭出promise来搞一搞,下面直接贴代码,简 ...