原文链接: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(); } } }
相关主题
译注
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"”两边的引号,之后的参数将以空格进行分隔输出。