0

外部実行可能ファイルを使用してメッセージ本文を変更する 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;

しかし、それは正しくありません。これを行う通常の方法はありますか?

4

1 に答える 1

2

あなたはあなたがそこに持っている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に解決されるとは限らないことに注意してくださいfile://。通常、拡張機能はパックされたXPIファイルとしてインストールされ、OSが実行できるものではなく、このアーカイブ内のファイルへのリンクのみを取得します。したがって、ファイルで<em:unpack>フラグを指定する必要がありinstall.rdfます。

このアプローチは単純ですが、起動パフォーマンスが低下します(拡張機能マネージャーは、理由により、デフォルトで拡張機能を解凍しません)。したがって、より良い解決策は、実行可能ファイルを最初に必要になったときに一時ディレクトリにコピーすることです。

于 2012-07-17T10:16:16.660 に答える