专栏首页晓晨的专栏浏览器启动外部软件

浏览器启动外部软件

常可以看见使用浏览器代码启动本地应用的软件.例如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 条评论
登录 后参与评论

相关文章

  • ASP.NET Core 发布之后通过命令控制监听地址和环境变量

    晓晨
  • Sql Server利用游标批量清空数据表

    晓晨
  • Jenkins高级用法 - Jenkinsfile 介绍及实战经验

    Jenkinsfile 是 Jenkins 2.x 核心特性 Pipeline 的脚本,由Groovy语言实现。Jenkinsfile一般是放在项目根目录,随项...

    晓晨
  • 代价函数

    代价函数,度量【假设集】的准确性。 机器学习中常用的代价函数,总结如下: 1 误差平方和函数 ? 说明:yi 是模型预测值,oi是样本实际值 2 交叉熵函数...

    陆勤_数据人网
  • 深入浅出Substrate:剖析运行时Runtime

    基于Substrate开发自己的运行时模块,会遇到一个比较大的挑战,就是理解Substrate运行时(Runtime)。本文首先介绍了Runtime的架构,类型...

    MikeLoveRust
  • 大佬,JavaScript 柯里化,了解一下?

    柯里化, 即 Currying 的音译。Currying 是编译原理层面实现多参函数的一个技术。

    沃趣科技
  • 我是如何发现Google服务器上的LFI漏洞的

    本文将介绍如何利用本地文件包含漏洞读取Google某服务器上的任意文件。漏洞存在于Google的Feedburner中,在提交漏洞后,Google安全团队迅速修...

    FB客服
  • 【Unity3D】Unity3d 与串口的通信程序的开发,软件硬件结合

    串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度)

    恬静的小魔龙
  • Debian 9下安装Ruby on Rails与NGINX

    Ruby on Rails是一个Web框架,允许Web设计人员和开发人员实现动态的功能齐全的Web应用程序。在生产中部署Rails应用程序时,开发人员可以从几个...

    Likenttt
  • Python基础学习-函数

    一:定义函数: ① 函数是带名字的代码块,用于完成具体的工作。 ② 函数使用关键字def来定义,最后,定义以冒号结尾。 ③ 每个函数后面都应紧跟一个文档字符串,...

    爱吃西瓜的番茄酱

扫码关注云+社区

领取腾讯云代金券