通过浏览器执行带有参数的本地应用程序

Executing a local application with parameters via a browser

在我的软件中,我依靠 NPAPI 通过浏览器直接启动本机应用程序,并传递给它的参数。最近,所有浏览器都在积极放弃对 NPAPI 的支持,缺少该功能意味着该软件的死胡同。

我研究了做同样事情的替代方案,得到了以下结果。

  1. 本地消息传递 迄今为止最推荐的方法,也易于实施。这种方法需要客户端系统通过更改系统中的注册表值来向机器注册(糟糕的用户体验)。我不能使用这种方法来完成所需的任务,因为这意味着糟糕的用户体验。此外,扩展中的代码是可利用的,因为它里面有一个会话变量。

  2. 自定义URL 同样是一种很好用的方法,但注册协议是另一种糟糕的用户体验。此外,我不确定使用此方法传递的变量。

有没有没有安全问题、良好的用户体验并使用一次性授予访问本地资源的权限的方法?

由于这里没有给出正确的答案,而我在我的软件上解决了这个问题,所以我想我会在这里写一个答案作为以后遇到同样问题的人的参考。

浏览器严重反对访问本机应用程序。您可能对要执行的任务抱有良好的意图,但这种访问可能会以多种方式被滥用,从而损害客户端计算机。

我找到了一个带有 URI 方案的临时解决方案,但我计划放弃需要我执行此操作的整个体系结构。

无论您找到什么解决方案,您编写的代码很可能会在一年内过时,因为浏览器正在慢慢放弃对此类内容的支持。

因此,最好的选择是在设计中考虑一个解决方案,即您不必执行此操作。它将帮助您更长时间地维护您的代码。

如果你还想做。那么以下方式可能是最好的(仅Windows,截至 2017 年 3 月 21 日)。

  1. 编写一个可执行文件(使用任何语言,例如:c++)来解释您想要的参数并使用特定命令提供给命令提示符。

例如,如果您想使用特定文件打开记事本,则需要使用可执行文件向命令提示符提供以下命令

notepad args[0]

args[0] 将是您通过浏览器传递的参数。如果记事本不在 PATH 变量中,也请提供完整路径。

  1. 在客户端注册表中注册自定义 URI 方案以启动此可执行文件。这将是一次性的事情,您可以为客户端提供一个注册表文件 运行。

最后,您可以通过指定您的自定义 URI 和参数,通过浏览器 link 调用本机应用程序。在记事本的情况下,如果您的自定义 URI 是 qwerty:// 那么调用可能看起来像

qwerty:// c:/Personal/temp.txt

请注意,此方法并非没有安全问题,您必须解决这些问题。我没有解决方案,因为我去更改设计而不是寻求临时解决方案。