Javascript 如何通过URI引用外部二进制文件?

Javascript 如何通过URI引用外部二进制文件?,javascript,thunderbird,thunderbird-addon,Javascript,Thunderbird,Thunderbird Addon,我有一个Thunderbird扩展,它使用外部可执行文件对消息体进行变异。目前,我做了一项黑客工作,只需将此可执行文件放入/tmp/someBinary中,并这样称呼它: var exe = FileUtils.File("/tmp/someBinary"); var proc = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces

我有一个Thunderbird扩展,它使用外部可执行文件对消息体进行变异。目前,我做了一项黑客工作,只需将此可执行文件放入
/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;

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

您需要询问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不一定会解析为
文件://
URL。通常,扩展名是作为打包的XPI文件安装的,并且只会获得指向此归档文件中的文件的链接,而不是操作系统可以执行的内容。因此,您需要在
install.rdf
文件中指定


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

尝试类似以下内容:var nsIFileS=Components.interfaces.nsIFileURL;然后使用nsIFileS.init(…)用URL对其进行初始化。这很完美,您就是伟大的Wladimir。