用于打开资源管理器的自定义URI协议

时间:2017-04-05 15:03:44

标签: windows registry uri protocols

我们有专为Google Chrome设计的应用,我们需要添加指向网络文件共享的链接。很遗憾,出于安全考虑,Chrome拒绝file:// protocol。我们希望设置自定义协议以允许此功能。

我认为这样做的好方法是打电话给探险家。以下是我们添加的注册表项:

[HKEY_CLASSES_ROOT\MyApp\DefaultIcon]
@="\"C:\\Windows\\explorer.exe\""

[HKEY_CLASSES_ROOT\MyApp\shell]

[HKEY_CLASSES_ROOT\MyApp\shell\open]

[HKEY_CLASSES_ROOT\MyApp\shell\open\command]
@="\" C:\\Windows\\explorer.exe\" \"%1\""

目前,我们收到一条错误消息,指出协议无效。任何人都可以协助纠正这个问题吗?

非常感谢你们。

3 个答案:

答案 0 :(得分:1)

@ Wolfram Schmied,

我刚刚使用CMD在您的计算机上写了一种解决方法:

REGEDIT4

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

[HKEY_CLASSES_ROOT\IntranetFileLauncher\DefaultIcon]
@="\"C:\\Windows\\explorer.exe\""

[HKEY_CLASSES_ROOT\IntranetFileLauncher\shell]

[HKEY_CLASSES_ROOT\IntranetFileLauncher\shell\open]

[HKEY_CLASSES_ROOT\IntranetFileLauncher\shell\open\command]
@="cmd /c set url=\"%1\" & call set url=%%url:intranetfilelauncher:=%% & call start explorer file:%%url%%"

上面的代码与您的代码基本相同,除了最后一行使用cmd.exe打开文件/文件夹命令。 用伪代码:打开commandpromt,将给定的文件路径作为变量'url'传递,通过剥离协议标识符来更改变量'url',最后使用剥离的文件路径打开资源管理器

我希望这会有所帮助。

答案 1 :(得分:0)

我在Windows 8 / Firefox上使用了以下内容。

this MSDN article中介绍了注册自定义协议的正确方法

可悲的是,您无法将此直接应用于Windows资源管理器。如果你这样做,你会发现资源管理器开始产生副本,直到你的记忆或你的耐心耗尽,你必须注销才能停止它。原因是处理协议的应用程序传递整个链接,包括协议规范。 I.,如果你有链接

localdir:D:\somefolder

结果通话不会是

explorer D:\somefolder

但是

explorer localdir:D:\somefolder

这显然已经完成,因此相同的应用程序可以处理多个协议。但是Explorer并没有意识到它是为了处理请求,而是重新启动解决过程,这使得恶性循环处于运动状态。

为了解决这个问题,你调用一个简单的帮助应用程序,从参数中删除协议规范,然后用清理后的字符串调用资源管理器。

作为一个例子,我创建了一个简单的Java类Stripper

import java.io.IOException;
public class Stripper {
  public static void main(String[] args) {

    String stripped = args[0].substring("localdir:".length());
    try { 
      Runtime.getRuntime().exec("C:\\Windows\\explorer.exe "+stripped);
    }
    catch (IOException e) { /* error handling */ }
  }
}

以下是将.reg文件添加到注册表所需的密钥。这假设Stripper位于fol D:\Stripper

Windows Registry Editor Version 5.00

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

[HKEY_CLASSES_ROOT\localdir\shell]

[HKEY_CLASSES_ROOT\localdir\shell\open]

[HKEY_CLASSES_ROOT\localdir\shell\open\command]
@="cmd /c \"cd /d d:\\Stripper & java Stripper %1\""

该命令调用命令行解释器,告诉它首先切换到包含我们帮助器的目录,然后调用JRE来执行它。它有点尴尬,但它确实有效。

使用原生.exe文件,command键可能如下所示:

[HKEY_CLASSES_ROOT\localdir\shell\open\command]
@="<somepath>Stripper.exe %1"

这是一个快速的肮脏解决方案,您显然希望添加检查和平衡以及可能更多的机制,但一般方法看起来可行。

答案 2 :(得分:0)

这里的任务相同,首先是与@mdbxz相同的解决方案,然后是使用VBScript以不显示cmd黑框的方式:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\explorer]
@="URL:VIR Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\explorer\shell]

[HKEY_CLASSES_ROOT\explorer\shell\open]

[HKEY_CLASSES_ROOT\explorer\shell\open\command]
@="mshta vbscript:Close(Execute(\"CreateObject(\"\"WScript.Shell\"\").Run Join(Array(\"\"iexplore.exe\"\",Replace(\"\"%1\"\",\"\"explorer\"\",\"\"https\"\"))), 1, True\"))"

这些问题是,如果我们在资源管理器中单击相同的链接,它将处理相同的内容,因此它会打开一个新窗口,而不仅仅是跳转到该链接。还有一个问题,如果我们要使用协议打开给定的应用程序。

我们可以将新协议注册到资源管理器,以便将其转换为https吗?然后我们就不需要替换协议了。