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

Windows 如何创建自己的URL协议?(例如,so://……),windows,protocols,protocol-handler,Windows,Protocols,Protocol Handler,我看到: http://www... ftp://blah.blah... file://blah.blah... unreal://blah.blah... mailto://blah.blah... 您看到的http等的第一部分叫什么 我可以自己注册吗?你真的不需要这样做。我见过很多程序,比如emule,创建了自己的协议规范(我认为这就是所谓的)。之后,您基本上只需在注册表中设置一些值,以确定哪个程序处理该协议。我不确定是否有协议说明符的官方注册。如果你想让人们从浏览器中打开你的应用程序

我看到:

  • http://www...
  • ftp://blah.blah...
  • file://blah.blah...
  • unreal://blah.blah...
  • mailto://blah.blah...
您看到的
http
等的第一部分叫什么


我可以自己注册吗?

你真的不需要这样做。我见过很多程序,比如emule,创建了自己的协议规范(我认为这就是所谓的)。之后,您基本上只需在注册表中设置一些值,以确定哪个程序处理该协议。我不确定是否有协议说明符的官方注册。如果你想让人们从浏览器中打开你的应用程序,没有什么可以阻止你为自己的应用程序创建自己的协议说明符。

它被称为协议。唯一阻止您制定自己协议的是您必须:

  • 编写某种类型的浏览器或用户代理,了解该协议的URL形式和实际数据格式
  • 编写一个理解该协议的服务器
  • 最好为协议制定一个规范,以便浏览器和服务器可以继续协同工作
  • Windows使#1变得非常简单,在许多情况下,这就是您真正需要的。即:


    第一部分称为协议,是的,您可以注册自己的协议。在Windows上(我假设您是在使用C标签的情况下这样做的-对不起,Mono fans),它已经完成了。

    带有
    HTTP://
    FTP://
    等的部分被调用

    您可以通过注册表注册自己的帐户

    HKEY_CLASSES_ROOT/
      your-protocol-name/
        (Default)    "URL:your-protocol-name Protocol"
        URL Protocol ""
        shell/
          open/
            command/
              (Default) PathToExecutable
    
    资料来源:,

    这是一份已注册用户的列表。每一个都有一个RFC——一个定义它的文档,这几乎是一个标准。RFC告诉新应用程序(如浏览器、ftp客户端等)的开发人员他们需要支持什么。如果您需要新的基本级别协议,可以使用未注册的协议。其他答案告诉你怎么做。请记住,您可以使用现有协议做很多事情,从而获得它们的现有实现。

    这对于每个浏览器都是不同的,在IE和windows中,您需要创建一个他们称之为可插入协议处理程序的程序

    基本步骤如下:

  • 实现IInternetProtocol接口
  • 实现IInternetProtocolRoot接口
  • 实现IClassFactory接口
  • 可选。实现IInternetProtocolInfo接口。对HTTP协议的支持由事务处理程序提供
  • 如果实现了IInternetProtocolInfo,请提供对PARSE_SECURITY_URL和PARSE_SECURITY_DOMAIN的支持,以便URL安全区域管理器能够正确处理安全性。 为协议处理程序编写代码
  • 提供对BINDF_NO_UI和BINDF_SILENTOPERATION的支持
  • 在注册表中HKEY_CLASSES_ROOT\PROTOCOLS\handler下添加协议处理程序的子项
  • 在子键下创建一个字符串值CLSID,并将该字符串设置为协议处理程序的CLSID
  • 有关windows端的更多详细信息,请参阅。windows SDK中还有一个示例

    一个快速的google也显示了这篇关于codeproject的文章:

    最后,作为一名安全人员,我必须指出,这段代码需要经过斗争。这是一个高风险,因为要做到这一点,你不能在托管代码中做它,而必须在C++中完成(我想你可以使用VB6)。你应该考虑你是否真的需要这么做,如果你真的这么做,仔细设计并安全地编码。攻击者只需在页面上包含链接,即可轻松控制传递给您的内容。例如,如果您有一个简单的缓冲区溢出,那么没有人能更好地执行此操作:


    强烈考虑使用StruScript和VC8和以上编译器中包含的新的安全CRT方法。看看你是否不知道我在说什么。

    对于大多数Microsoft产品(Internet Explorer、Office、“打开文件”对话框等),当打开带有适当前缀的URI时,可以运行该对话框。这是更常见的一部分-如何实现您自己的协议


    对于Mozilla,解释是Java-。

    打开记事本并将下面的代码粘贴到其中。将“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\""
    

    尽管有关于如何使协议在Windows中工作的技术细节,但这是最重要的答案。你不应该创建一个新的URI方案,除非它注册到IETF,或者使用一个实验性的名称空间(比如X前缀),那么非Windows操作系统呢?“非Windows操作系统呢?”它是特定于应用程序的。我认为它在Windows上也经常是特定于应用程序的(这不会让一切都神奇地工作)。注册表项告诉Windows将带有该协议的Uri传递给指定的应用程序,其他一切都应由应用程序自己处理。可插拔协议处理程序无疑是更好的选择。
    (默认)
    这里的意思是空字符串。不要把它当作字面意思。这只是吸引用户点击它的一个例子。请解释这一点:因为要做到这一点,你不能在托管代码中做到这一点,而必须在C++中做到这一点。这是从.NET 2运行时(注:这包括3和3.5)的时间帧。它在同一进程中不支持不同的CLR运行时,因此,如果我编写了1.0处理程序,而您编写了2.0处理程序,并且我们的两个产品都安装在客户的计算机上,那么我们将一起确保浏览器每次启动时都会崩溃。4.0运行时试图解决这个问题,但我记得还有一些边界情况需要关注。但要点是在本机进程中使用.Net对象作为插件是绝对避免的