2

Firefox 拡張機能を 1 つのコンポーネントとして含むアプリケーションのベータ テストを行っています。FF3.5.5 が最新バージョンであるときに最初に展開され、3.5.6 および 3.5.7 を存続しました。ただし、FF3.6 では、エラー コンソールに次のように表示されます。

Warning: reference to undefined property Components.interfaces.nsIProcess2
Source file: chrome://overthewall/content/otwhelper.js
Line: 55

Error: Component returned failure code: 0x80570018 (NS_ERROR_XPC_BAD_IID) 
         [nsIJSCID.createInstance]
Source file: chrome://overthewall/content/otwhelper.js
Line: 55

エラーをスローする関数は次のとおりです。

48 function otwRunHelper(cmd, aCallback) {
49  var file =
50      Components.classes["@mozilla.org/file/local;1"].
51      createInstance(Components.interfaces.nsILocalFile);
52  file.initWithPath(otwRegInstallDir+'otwhelper.exe');
53
54  otwProcess = Components.classes["@mozilla.org/process/util;1"]
55                  .createInstance(Components.interfaces.nsIProcess2);
56
57  otwProcess.init(file);
58  var params = new Array();
59  params = cmd.split(' ');
60  
61  otwNextCallback = aCallback;
62  otwObserver = new otwHelperProcess();
63  otwProcess.runAsync(params, params.length, otwObserver, false);
64 }

ご覧のとおり、この関数はすべて、いくつかのコマンド ライン パラメーターを指定して外部 EXE ヘルパー ファイル (レジストリ キーによって配置されている) を実行し、オブザーバーを設定して応答を非同期的に待機し、終了コードを処理するだけです。

問題のある行は、 Components.interfaces.nsIProcess2が FF3.6 で定義されなくなったことを意味します。それはどこに行きましたか?Mozilla のドキュメントには、最新のリリースで変更されたことを示すものは何も見つかりません。

4

1 に答える 1

5

nsIProcess2 のメソッドは nsIProcess に移動されました。コードを両方のバージョンで動作させるには、次の行を変更します。

otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(Components.interfaces.nsIProcess2);

これに:

otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(Components.interfaces.nsIProcess2 || Components.interfaces.nsIProcess);

それでも警告は表示されますが、エラーは解消され、コードは両方のバージョンで問題なく動作します。インターフェイス iid を変数に格納して、変数を使用することもできます。

let iid = ("nsIProcess2" in Components.interfaces) ?
  Components.interfaces.nsIProcess2 :
  Components.interfaces.nsIProcess;
otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(iid);
于 2010-02-08T20:53:16.163 に答える