zoukankan      html  css  js  c++  java
  • 利用Pluggable Protocol实现浏览器打开本地应用程序

    引子

    1. 懂HTML网页设计的人:<a href="mailto:liushaofeng89@qq.com">联系我们</a>这样的用法在网页中随处可见,只要通过点击这个超链接,系统默认的就会打开本地的outlook应用程序,并且自动创建新邮件,目标邮件接收人就是这里的liushaofeng89@qq.com;
    2. 会迅雷的人都知道:ed2k://|file|[僵尸先生].Mr.Vampire.1985.REMASTERED.2Audio.D*64.AC3.iNT-ZY.-cd1.mkv|733160187|701476DF**B50E1CE7|/这样的地址;magnet:?xt=urn:btih:88594AAACBDE40EF3E*ent.com%3a80%2fannou*istribution.bbb3d.render*b_sunflower_1080p_30fps_normal.mp4;这些都是迅雷支持的文件格式,当系统的剪贴板存在这些协议URI时,系统就会打开迅雷;
    3. 用过电驴的人都知道:emule://*** 这是电驴所支持的文件协议格式;
    4. 网民所熟悉的:HTTPHTTPS等等。

          以上这些我们最常见的一些标识,你难道就不好奇他们是怎么工作的吗?

    背景

      以上这些技术的实现都是依赖于微软操作系统所提供的Pluggable Protocol,Pluggable Protocol又叫URL Protocol,也有Shell命令的叫法,通用的Protocol协议还有ftp,telnet等,这些协议都是Windows操作系统在安装的时候自带的,在系统的注册表中都提供了这些协议的解析。 

      系统支持哪些协议,可以通过查询注册表HKEY_CLASSES_ROOT/PROTOCOL/handler看到。在日常的生活中,要如何灵活的运用自定义Protocol才是最重要的,最典型的有淘宝页面的“与我联系”按钮,点击时,打开阿里旺旺聊天窗口,腾讯QQ也有用到,什么样的场景适合用到这种技术,这里就不多做说明,感兴趣的可以下来自行研究学习。

      通过注册表观察观察一下这些协议都是如何定义的:

      

      

    实现步骤

      要实现上述的效果,主要需要以下几个步骤:

    1. 在网页中定义一种协议。当然协议的名称不能与已有的协议名称冲突。例如本次文章中作者将share作为自定义协议名称。
    2. 编写自己逻辑相关的本地程序或脚本。从自定义的URI协议中获取到的数据,需要用来做什么,这里都可以在本地程序中作为参数传入,然后需要实现什么业务都可以自行编写。
    3. 将协议与本地的程序或脚本相关联。通过注册表配置将本地的程序或脚本与网页或其他方式触发的URI数据绑定映射起来,这样只要是这个协议下的URL都会出发本地的程序被调用,这样就达到了通过网页来调动本地程序的目的。

    DEMO一下: 

       今天就带着大家通过自定义协议,从网页调用本地MS-Office应用程序去打开本地的Office文档(我在桌面上创建了一个PluggableProtocol.pptx文档)。

      1.约定URI格式:share://<word|ppt|excel|visio>?<filepath> share://ppt?C:UsersliushaofengDesktopPluggableProtocol.pptx

      2.通过注册表的关联,最终传入到本地程序的数据就是“share://ppt?C:UsersliushaofengDesktopPluggableProtocol.pptx”,那么如何从这个字符串解析出文件地址,对于本地应用程序来说都是So Easy的是吧。通过上面的注册表我们可以发现,这个地址会被一次性的传给本地程序,中间不能做任何格式化处理或正则处理(探索了四五天没有任何结果,如果大家有实现办法,请给我留言,谢谢)。而word程序的调用是如下格式:“start winword <localfilepath|remotefileptah>”,因此这里是需要一个中介,实现URL地址到文件路径的解析转换,然后再把真实的文件路径传给word程序,这里我选择bat脚本来实现。

      接下来我们开始编写bat脚本(脚本放在桌面C:UsersliushaofengDesktopshare.bat):  

    ECHO OFF
    
    REM 接收URI地址(share://ppt?C:UsersliushaofengDesktopPluggableProtocol.pptx)
    SET PROTOCOL_ADDRESS=%1
    
    REM 接收到文件类型和文件地址(ppt?C:UsersliushaofengDesktopPluggableProtocol.pptx)
    SET FILE_TYPE_PATH=%PROTOCOL_ADDRESS:~8%
    
    REM 文件类型为ppt时,截取文件路径,并传递给word
    IF %FILE_TYPE_PATH:~0,3%==ppt (
        REM 启动本地word程序,并传入文件路径地址
        ECHO %FILE_TYPE_PATH:~4%
        start powerpnt %FILE_TYPE_PATH:~4%
    )
    
    REM 其他文件类型,可以模仿着往下写
    
    EXIT

       3.关联脚本与自定义协议。

        a.打开注册表:WIN+R,运行下输入regedit,回车。

         

        b.找到HKEY_CLASSES_ROOT,在其上面右键新建项,命名为你需要设置的协议名称,我这里设置为share,并且依次创建如图所示的树形结构。并且在share,DefaultIcon,command三项上分别通过右键配置字符串值:

             

     HKEY_CLASSES_ROOT

       share
          URL Protocol = ""

      Under this new key, the URL Protocol string value indicates that this key declares a custom pluggable protocol handler. Without this key, the handler application will not launch. The value should be an empty string.

      Keys should also be added for DefaultIcon and shell. The Default string value of the DefaultIcon key must be the file name to use as an icon for this new URI scheme. The string takes the form "path, iconindex" with a maximum length of MAX_PATH. The name of the first key under the shell key should be an action verb, such as open. Under this key, a command key or a DDEEXEC key indicate how the handler should be invoked. The values under the command and DDEEXEC keys describe how to launch the application handling the new protocol.

      Finally, the Default string value should contain the display name of the new URI scheme. The following example shows how to register an application, alert.exe in this case, to handle the alert scheme.

      以上就是官网的配置说明,我这里不做多解释。配置的最终的结果如下:

      

      在注册表配置成功以后,首次通过该协议打开应用时,浏览器会有如下提示:

      

      是的,你没有看错,如果你足够细心或者掌握了这个技术以后,首次安装迅雷后,如果网页中有迅雷能够识别的协议文件地址时,点击后也会弹出这个框的。

      在浏览器第一次打开用户自定义协议的URI地址时,均会有上图的提示,这也就意味着你配置成功了(从协议定义到程序的传值通道已近成功建立了)。

      按照上述的的流程可以举一反三,开发出适合自己业务的应用程序。编程源于生活也高于生活!

      

      如果你觉得本博文对你有所帮助,请记得点击右下方的"推荐"哦,么么哒...

      转载请注明出处:http://www.cnblogs.com/liushaofeng89/p/5432770.html

     

    参考文章:

    1. https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx
    2. https://msdn.microsoft.com/en-us/library/aa767916(v=vs.85).aspx
    3. https://msdn.microsoft.com/en-us/library/ee318402(v=vs.85).aspx
    4. https://msdn.microsoft.com/en-us/library/aa767743(v=vs.85).aspx
  • 相关阅读:
    事务的隔离级别
    常用linux命令
    cpu.load avg和cpu使用率的区别
    【Leetcode】55. Jump Game
    【Leetcode】322. coin-change
    34.find-first-and-last-position-of-element-in-sorted-array
    【LeetCode】56.merge-intervals
    Leetcode】210.course-schedule-ii
    基于Thread实现自己的定时器Timer
    Boost--内存管理--(1)智能指针
  • 原文地址:https://www.cnblogs.com/liushaofeng89/p/5432770.html
Copyright © 2011-2022 走看看