原文鏈接:Registering an Application to a URL Protocol(http://msdn2.microsoft.com/en-us/library/aa767914.aspx)
文章《About Asynchronous Pluggable Protocols》(中譯[翻譯]關於“異步可插協議”(About Asynchronous Pluggable Protocols(APPs)))描述瞭如何爲一個新的協議開發處理程序(處理器handlers)。在一些案例中,可能會描述如何調用另外一個應用程序來處理自定義協議(custom protocol)。註冊已經存在的應用程序爲一個URL協議處理器即可。一旦應用程序被成功地啓動,我們可以使用命令行參數來重新找回URL來啓動它。
- 註冊應用程序來處理自定義協議
- 啓動處理程序
- 示例
- 相關主題
註冊應用程序來處理自定義協議
你必須添加一個新的key以及相關的value到HKEY_CLASSES_ROOT中,來使應用程序可以處理特殊的URL協議。
新註冊的key必須與協議scheme相匹配纔可以被添加。例如,增加一個“alert:”協議,被增加到HKEY_CLASSES_ROOT的key必須是alert。在這個新的key之下,默認的字符串value將顯示新協議的名字,並且URL協議字符串value將包含協議特有的信息或者空字符串。Keys將同樣被添加到DefaultIcon和shell中。
默認的DefaultIcon key的字符串value必須是新URL協議圖標文件名的路徑。(譯註1:DefaultIcon key)
在shell key之下,一個key使用一個動詞(就像open)將被添加。一個command(命令) key和一個DDEEXEC(動態數據交換執行) key都是使用動詞來添加的。這command和DDEEXEC keys之後的values都是用來調用(或者啓動)處理新協議的應用程序。
啓動處理程序
當一個用戶點擊一個註冊了你的自定義URL協議的鏈接後,Windows Internet Explorer(IE)啓動註冊的URL協議的處理器。如果指定shellopen命令在註冊表中包含一個%1參數的話,Internet Explorer傳遞這個URI給註冊協議的處理器。這最後的統一資源標識符(URI)被編碼(%1);即16進制換碼符被轉換爲等價的UTF-16字符。例如,用%20字符串取代空格。
安全警示:應用程序處理URL協議必須全力面對惡意數據。因爲處理程序接收來自不信任源的數據,URL和其它參數值傳遞給應用程序可能包含的惡意數據企圖使用處理程序。因此,處理程序可以首先啓動基於外部數據的空閒行爲確認這些行爲以及它們的用戶。
注意:另外,處理程序將要有能力處理URLs有可能太長或者包含意想不到(或者多餘的)字符串。更多信息,請參看《Writing Secure Code》
示例
接下來的例子演示如何註冊alert.exe應用程序,來處理alert協議。
HKEY_CLASSES_ROOT alert (Default) = "URL:Alert Protocol" URL Protocol = "" DefaultIcon (Default) = "alert.exe" shell open command (Default) = "C:/Program Files/Alert/alert.exe" "%1"
增加這些設置信息到註冊表,嘗試導航到像“alert:Hello%20World”這樣的URLs中,將會嘗試啓動alert.exe程序並且在命令行中傳遞“Hello World”
下面的代碼包含了一個簡單的C#控制檯應用程序演示了一種實現alert協議處理程序的方式。
using System; using System.Collections.Generic; using System.Text; namespace Alert1 { class Program { static string ProcessInput(string s) { // TODO Verify and validate the input // string as appropriate for your application. // return s; } static void Main(string[] args) { Console.WriteLine("Alert.exe invoked with the following parameters./r/n"); Console.WriteLine("Raw command-line: /n/t" + Environment.CommandLine); Console.WriteLine("/n/nArguments:/n"); foreach (string s in args) { Console.WriteLine("/t" + ProcessInput(s)); } Console.WriteLine("/nPress any key to continue..."); Console.ReadKey(); } } }
相關主題
About Asynchronous Pluggable Protocols Debugging Tips
譯註
2.詳細步驟:
- 編寫如上所示的控制檯程序,並記錄下exe所在的全路徑;
- 開始->運行->輸入“REGEDIT”確定,以啓動“註冊表編輯器”;
- 找到(通常是第一個)HKEY_CLASSES_ROOT節點,右鍵新建項,輸入你期望的協議名,如GoCool;
- 同樣方式建立如下所示層級結構:
- 在瀏覽器執行:
值得注意的是參數會默認以“,”開始,不過沒關係,能夠得到所有的URL字符串,對我們來說,其他內容也就是一些老調重彈了。這個“,”就是在設置command中的那個"……","%1"中的這個逗號。也可以用“C:/GoCoolCenter/MyCSharpProject/ConsoleApplication/CA_RegisteringHandlingCustomProtocol/CA_RegisteringHandlingCustomProtocol/bin/Debug/CA_RegisteringHandlingCustomProtocol.exe "%1"”的語句來代替之前的語句。去掉“"%1"”兩邊的引號,之後的參數將以空格進行分隔輸出。