利用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:\Users\liushaofeng\Desktop\PluggableProtocol.pptx

  2.通過注冊表的關聯,最終傳入到本地程序的數據就是“share://ppt?C:\Users\liushaofeng\Desktop\PluggableProtocol.pptx”,那么如何從這個字符串解析出文件地址,對於本地應用程序來說都是So Easy的是吧。通過上面的注冊表我們可以發現,這個地址會被一次性的傳給本地程序,中間不能做任何格式化處理或正則處理(探索了四五天沒有任何結果,如果大家有實現辦法,請給我留言,謝謝)。而word程序的調用是如下格式:“start winword <localfilepath|remotefileptah>”,因此這里是需要一個中介,實現URL地址到文件路徑的解析轉換,然后再把真實的文件路徑傳給word程序,這里我選擇bat腳本來實現。

  接下來我們開始編寫bat腳本(腳本放在桌面C:\Users\liushaofeng\Desktop\share.bat):  

ECHO OFF

REM 接收URI地址(share://ppt?C:\Users\liushaofeng\Desktop\PluggableProtocol.pptx)
SET PROTOCOL_ADDRESS=%1

REM 接收到文件類型和文件地址(ppt?C:\Users\liushaofeng\Desktop\PluggableProtocol.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM