浏览器启动外部软件

常可以看见使用浏览器代码启动本地应用的软件.例如qq、迅雷、等等.那么他们是怎么做到的呢? 它的奥秘:Register protocol 前言我们经常看到 tencent://..thunder://这两种开头的网址,往往觉得很奇怪,很想弄懂其中的原理,是如何实现的,我查找了相关的 资料,终于找到了,跟大家分享下。原理篇

tencent://..

thunder://..

这些是腾讯和迅雷的协议,即页面上或地址栏里的链接只要输入带有 tencent://… 的协议,就会自动调用一个已写好的程序执行该协议的操作。 或者是打开页面,迅雷的是下载资源的链接 。通过微软的说明,知道这是Register protocol,对于 Windows、Linux 和 OS X 操作系统都可以注册这样的协议。比如说 Windows,其实只需写入注册表,即可实现协议与执行程序的关联。例如腾讯的协议注册表如下:

[HKEY_CLASSES_ROOT\TENCENT]
@="TencentProtocol""URL Protocol"="D:\\Program Files\\Tencent\\QQ\\Timwp.exe"
[HKEY_CLASSES_ROOT\TENCENT\DefaultIcon]
@="D:\\Program Files\\Tencent\\QQ\\Timwp.exe,1"
[HKEY_CLASSES_ROOT\TENCENT\shell]
[HKEY_CLASSES_ROOT\TENCENT\shell\open]
[HKEY_CLASSES_ROOT\TENCENT\shell\open\command]
@="\"D:\\Program Files\\Tencent\\QQ\\Timwp.exe\" \"%1\""

 所实现的就是当浏览器(或其它)碰到 tencent://… 时,自动调用Timwp.exe,并把tencent://… 地址作为第一个参数传递给Timwp.exe。实现篇下面我们自己来实现这样的需求:要实现如上功能,最主要的还是对注册表的处理。新建一个注册表文件

Windows Registry Editor Version 5.00  
[HKEY_CLASSES_ROOT\FinstoneRpt] 
@="FRptProtocol" "URL Protocol"="I:\\Release\msdn5.exe"
 [HKEY_CLASSES_ROOT\FinstoneRpt\DefaultIcon] @="I:\\Release\\msdn5.exe,0" 
[HKEY_CLASSES_ROOT\FinstoneRpt\shell] 
 [HKEY_CLASSES_ROOT\FinstoneRpt\shell\open]
  [HKEY_CLASSES_ROOT\FinstoneRpt\shell\open\command] 
@="\"I:\\Release\\msdn5.exe/" \"%1\""

 以上定义了协议名:FinstoneRpt,及相关调用处理程序的位置。各位可自行调整。将上述内容导入到注册表中! 然后在相关网页里加上一个连接:

<a href="FinstoneRpt://message/?id=3e5065a6-19a0-41e6-afab-db7cc4bd3c76">test</a>

当点击时,则会调用注册表中记录的程序。 当然该程序可以接受参数:就是href里的所有内容。可根据情况自行判断处理。 如需通过vs的安装程序实现安装时自动执行以上操作。在安装程序里,导入上述注册表文件,因为用户安装时的路径不一样,要定位注册表中记录的程序,只需在vs里将相关注册键值修改:将涉及具体地址都一一改成[TARGETDIR]程序名,即可。当你注册协议后,你就可以用指定的程序去“解释”这个协议,在软件里通过取命令行(GetCommandLine)获取传递过来的参数就行了.

本文转自:http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1087

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏yukong的小专栏

【SpringBoot2.0系列08】SpringBoot之redis数据缓存管理目标实现

【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板

31620
来自专栏Kubernetes

深度剖析Kubernetes动态准入控制之Admission Webhooks

Author: xidianwangtao@gmail.com Admission Controll的最佳配置 这部分内容,请参考我的上一篇博文深度剖析K...

63270
来自专栏java、Spring、技术分享

Ribbon与Spring cloud整合源码分析

Ribbon是一种客户端的负载均衡器。提供了多种负载均衡的算法,支持多种协议(HTTP,TCP,UDP),并提供了故障容错的能力。官方网址为:https://g...

17830
来自专栏搜云库

Spring Boot 中使用 MyBatis 整合 Druid 多数据源

本文将讲述 spring boot + mybatis + druid 多数据源配置方案。 环境 CentOs7.3 安装 MySQL 5.7.19 二进制版本...

38670
来自专栏Java Web

使用RESTful风格开发Java Web

REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,而 HTTP 是一种包...

23250
来自专栏bboysoul

初识ansible

但是这个都不管,我们主要是用来做ansible的实验,还有如果文章中没有说明,那么一切操作都是在k8s-master节点上操作

16340
来自专栏猿天地

spring cloud gateway 全局过滤器

全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP访问限制等等。

76220
来自专栏Kubernetes

containerd源码分析

本文是对containerd v0.2.4的源码分析。 ##Containerd源码流程图 ? 源码接口调用详情 从ctr调用containerd-api #...

78070
来自专栏xcywt

UNIX域协议(无名套接字)

关于什么是UNIX域套接字可以参考:https://cloud.tencent.com/developer/article/1018893 这里主要介绍非命名的...

20370
来自专栏Java Web

使用RESTful风格开发Java Web

13930

扫码关注云+社区

领取腾讯云代金券