利用Register protocol實現網頁呼叫桌面程式(類似迅雷、QQ等)

鄧學彬發表於2012-11-25

前言

我們經常看到 tencent://.. thunder://     這兩種開頭的網址,往往覺得很奇怪,很想弄懂其中的原理,是如何實現的,我查詢了相關的 資料,終於找到了,跟大家分享下。

原理篇

微軟官方說明:http://msdn.microsoft.com/en-us/library/Aa767914.aspx

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//CZBYReport.exe"
 
[HKEY_CLASSES_ROOT/FinstoneRpt/DefaultIcon]
@="I://Release//CZBYReport.exe,0"
 
[HKEY_CLASSES_ROOT/FinstoneRpt/shell]
 
[HKEY_CLASSES_ROOT/FinstoneRpt/shell/open]
 
[HKEY_CLASSES_ROOT/FinstoneRpt/shell/open/command]
@="/"I://Release//CZBYReport.exe/" /"%1/""


以上定義了協議名:FinstoneRpt,及相關呼叫處理程式的位置。各位可自行調整。
將上述內容匯入到登錄檔中,然後在相關網頁里加上一個連線:

<a href="FinstoneRpt://message/?id=3e5065a6-19a0-41e6-afab-db7cc4bd3c76">test</a>
當點選時,則會呼叫登錄檔中記錄的程式。當然該程式可以接受引數:就是href裡的所有內容。可根據情況自行判斷處理。 
如需通過VS的安裝程式實現安裝時自動執行以上操作。在安裝程式裡,匯入上述登錄檔檔案,因為使用者安裝時的路徑不一樣,要定位登錄檔中記錄的程式,只需在VS裡將相關注冊鍵值修改:


將涉及具體地址都一一改成[TARGETDIR]程式名,即可。


當你註冊協議後,你就可以用指定的程式去“解釋”這個協議,在軟體裡通過取命令列(GetCommandLine)獲取傳遞過來的引數就行了.

相關文章