【问题标题】:How to reference an external binary by URI?如何通过 URI 引用外部二进制文件?
【发布时间】:2023-03-26 16:28:01
【问题描述】:

我有一个 Thunderbird 扩展,它使用外部可执行文件来改变消息体。目前我做了一个hack-job,只是把这个可执行文件放在/tmp/someBinary,然后这样称呼它:

var exe = FileUtils.File("/tmp/someBinary");
var proc = Components.classes["@mozilla.org/process/util;1"]
                     .createInstance(Components.interfaces.nsIProcess);
proc.init(exe);
var args = [msgBody.path];
proc.run(true, args, args.length);

这显然很愚蠢,最好通过 URI 调用它并将可执行文件与应用程序捆绑在一起。可悲的是,我有限的 JS 意味着我只想出了以下内容:

var URL = ios.newURI("chrome://myExtension/content/someBinary",null,null);
var exe = URL.QueryInterface(Components.interfaces.nsIFileURL).file;

但这并不完全正确。有没有正常的方法来完成这项工作?

【问题讨论】:

  • 试试这样的 var nsIFileS= Components.interfaces.nsIFileURL;然后使用 nsIFileS.init(...) 用 URL 初始化它

标签: javascript thunderbird thunderbird-addon


【解决方案1】:

您需要询问 chrome 注册表,您在那里的 URL 解析为:

var chromeRegistry = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                               .getService(Components.interfaces.nsIChromeRegistry);
var URL = ios.newURI("chrome://myExtension/content/someBinary", null, null);
URL = chromeRegistry.convertChromeURL(URL);
var exe = null;
if (URL instanceof Components.interfaces.nsIFileURL)
  exe = URL.file;

请注意,chrome:// URL 不一定会解析为 file:// URL。通常,扩展安装为打包的 XPI 文件,并且只会获得指向此存档中文件的链接,而不是操作系统可以执行的内容。因此,您需要在 install.rdf 文件中指定 <em:unpack> flag

这种方法很简单,但会降低启动性能(扩展管理器默认情况下不会解压缩扩展是有原因的)。因此,更好的解决方案可能是在您第一次需要时将可执行文件复制到临时目录中。

【讨论】:

  • 太棒了,你是伟大的弗拉基米尔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多