如何创建自己的URL协议?(例如so://...)

240

我看到过:

  • http://www...
  • ftp://blah.blah...
  • file://blah.blah...
  • unreal://blah.blah...
  • mailto://blah.blah...

那个你看到的第一部分,比如 http 是什么称呼?

我能注册自己的吗?


20
正确的名称是“scheme”(请参见RFC 2616和2396)。即使许多URL方案以协议命名,这并不意味着访问资源的唯一方式是通过该协议。 - Marek
1
有两种类型的协议,但我不知道用什么术语来区分它们。 "file" 和 "mailto" 协议在客户端中处理。 "http" 和 "ftp" 协议在服务器中处理。起初,当我想要在服务器中处理某些内容时,我对在浏览器中处理的协议的答案感到困惑。 - Sam Hobbs
参见:https://dev59.com/MHVD5IYBdhLWcg3wHn2d - mklement0
如果您正在使用Python,可以安装simpler并使用register_protocol_handler - Carlos Roldán
8个回答

232

23
非Windows操作系统怎么办? - Bdoserror
10
非Windows操作系统怎么办?这取决于具体的应用程序。我认为在Windows上,这通常也是应用程序特定的(这并不会使所有事情都神奇地运行)。 - Calum
5
可插拔协议处理程序肯定是更好的选择。 - Miriam
8
“(Default)”在这里表示空字符串,不要字面理解。 - deerchao
4
你混淆了“方案”和“处理程序”。有一个mailto: URI方案的规范,但这与注册mailto:方案的URI处理程序没有任何关系。操作系统根本不关心,处理该方案的程序会完成所有工作。至少据我所知,Windows以完全相同的方式处理所有URI,将URI作为参数传递给指定的处理程序。 - Kal Zekdor
显示剩余9条评论

59

打开记事本并将以下代码粘贴到其中。将“YourApp”更改为您的应用程序名称。

将其保存为YourApp.reg,并通过在资源管理器中单击它来执行它。

就是这样!

REGEDIT4

[HKEY_CLASSES_ROOT\YourApp]
@="URL:YourApp Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\YourApp\DefaultIcon]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\""

[HKEY_CLASSES_ROOT\YourApp\shell]

[HKEY_CLASSES_ROOT\YourApp\shell\open]

[HKEY_CLASSES_ROOT\YourApp\shell\open\command]
@="\"C:\\Program Files\\YourApp\\YourApp.exe\" \"%1\" \"%2\" \"%3\" \"%4\" \"%5\" \"%6\" \"%7\" \"%8\" \"%9\""

2
如何从浏览器中调用,URL是什么。 - imp
1
实际上我在询问这个问题:http://stackoverflow.com/questions/24265292/how-to-pass-argument-through-custom-url-to-an-application。 - imp
3
.reg文件中的%1、%2等是您应用程序的参数。因此,如果您执行YourApp.exe "your argument",那么%1将等于"your argument"。 - Codebeat
6
只有%1才重要,在网址中无法指定%2和%3等内容。 - Trident D'Gao
1
https://gist.github.com/aleksey-bykov/d7d2bc61adf2da519f6844db87e023fa已经失效 - 有没有完整的自包含示例,其中包含URL和自定义协议处理程序,其中不使用整个URI,而是一个参数?我有以下内容:a.exe xxx param1 yyy,我希望通过mycust://param1或类似方式执行它。提前致谢! - J S
显示剩余13条评论

40

这对于每个浏览器都不同,在IE和Windows中,您需要创建他们所谓的可插拔协议处理程序。

基本步骤如下:

  1. 实现IInternetProtocol接口。
  2. 实现IInternetProtocolRoot接口。
  3. 实现IClassFactory接口。
  4. 选择性的。实现IInternetProtocolInfo接口。 HTTP协议的支持由事务处理程序提供。
  5. 如果实现了IInternetProtocolInfo,则为PARSE_SECURITY_URL和PARSE_SECURITY_DOMAIN提供支持,以便URL安全区域管理器可以正确处理安全性。 编写您的协议处理程序的代码。
  6. 提供BINDF_NO_UI和BINDF_SILENTOPERATION的支持。
  7. 在HKEY_CLASSES_ROOT \ PROTOCOLS \ Handler下为您的协议处理程序添加子键。
  8. 在子键下创建一个字符串值CLSID,并将字符串设置为您的协议处理程序的CLSID。

有关Windows详细信息,请参见MSDN上的关于异步可插拔协议的文章。 Windows SDK中也有示例。

快速搜索还显示了这篇关于Codeproject的文章:http://www.codeproject.com/KB/IP/DataProtocol.aspx

最后,作为安全专家,我必须指出,这段代码需要经过严格测试。它面临高风险,因为要可靠地执行此操作,您不能在托管代码中执行它,而必须在C ++中执行(我想您可以使用VB6)。您应该考虑是否真的需要这样做,如果确实需要,请仔细设计并编写安全的代码。攻击者可以通过简单地在页面上包含链接来轻松控制传递给您的内容。例如,如果有一个简单的缓冲区溢出,那么没人最好不要这样做:<a href="custom:foooo{insert long string for buffer overflow here}"> Click me for free porn</a>

强烈建议使用VC8及其以上版本编译器中包含的strsafe和新的安全CRT方法。如果您不知道我在说什么,请参阅http://blogs.msdn.com/michael_howard/archive/2006/02/27/540123.aspx


7
这只是一个示例,旨在吸引用户点击它。 - Peter Oehlert
请解释以下内容:“因为为了可靠地完成它,您不能在托管代码中执行它,而必须在 C++ 中执行”。 - LogicDaemon
2
这段内容来自 .Net 2.0 运行时(注意,包括 3.0 和 3.5)。它不支持在同一进程中使用不同的 CLR 运行时,因此如果我编写了一个 1.0 处理程序,而你编写了一个 2.0 处理程序,并且我们两个产品都安装在客户计算机上,那么每次启动浏览器时都会导致崩溃。4.0 运行时试图解决这个问题,但我的记忆是仍然存在边界情况需要关注。但要点是,在 4.0 之前绝对应避免在本地进程中使用 .Net 对象作为插件,可能仍有一些角落案例需要担心。 - Peter Oehlert

19

以下是已注册的URI方案列表。每个方案都有一个称为RFC的文档定义它,几乎是一种标准。RFC告诉新应用程序(如浏览器、ftp客户端等)的开发人员需要支持什么。如果您需要一个新的基本协议,则可以使用未注册的协议。其它答案会告诉您如何操作。请记住,您可以利用现有协议进行许多操作,从而获得其现有的实现。


6
尽管在Windows中如何使协议工作的技术细节很重要,但这是最重要的答案。除非它已经在IETF注册,或使用实验性的命名空间(比如X-前缀),否则不应该创建新的URI方案。 - Alnitak
@Alnitak 为什么不呢?这是非法的吗? - Juan Perez
@JuanPerez 因为否则可能会与已注册的URI方案冲突。 - Alnitak
@Alnitak 很有趣。我和我认识的许多人都使用 mqtt://,但它并未在列表中注册。 - Juan Perez
@JuanPerez 那么就应该有人去注册它... - Alnitak
显示剩余3条评论

4

对于大多数微软产品(如Internet Explorer、Office、“打开文件”对话框等),您可以注册应用程序,以在打开具有适当前缀的URI时运行该应用程序。这是更常见的解释的一部分 - 如何实现自己的协议。

对于Mozilla,解释在此处,Java - 在此处


3
它被称为协议。唯一阻止你制定自己的协议的事情是你必须:
  1. 编写一个浏览器或某种用户代理程序,它可以理解该协议,包括其URL形式和实际数据格式
  2. 编写一个可以理解该协议的服务器
  3. 最好有一个协议规范,以便浏览器和服务器可以继续配合工作。
Windows使第1步非常容易,在许多情况下,这实际上是你所需要的。例如: 将应用程序注册到URL协议

1
第一部分称为协议,是的,您可以注册自己的协议。在Windows上(我假设您正在使用C#标签 - 对不起,Mono粉丝),可以通过注册表进行操作

-12

实际上你不必进行注册。我见过很多程序,例如emule,创建它们自己的协议指示器(我认为是这样称呼的)。之后,你只需在注册表中设置一些值来指定哪个程序处理该协议即可。我不确定是否有任何官方的协议指示器注册表。如果你希望让人们从浏览器中打开你的应用程序,那么自己创建一个协议指示器也并不难。


5
-1:误导性,使用不准确的术语并没有提供任何真正的价值。 - Marek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接