2012-07-16 92 views
0

我有一个使用外部可执行文件来改变邮件正文的Thunderbird扩展。目前,我做一个黑客作业,只是把这个可执行文件在/tmp/someBinary,并调用它像这样:如何通过URI引用外部二进制文件?

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; 

但这不是很正确。有没有正常的方法来完成这件事?

+0

尝试类似这样var nsIFileS = Components.interfaces.nsIFileURL;然后使用nsIFileS.init(...)使用URL – ama2 2012-07-16 18:48:08

回答

2

你需要问铬注册表你有什么网址有解析为:

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

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

+0

进行初始化。这非常完美,你很棒弗拉基米尔。 – 2012-07-17 17:11:29

相关问题