我正在测试一个包含Firefox扩展作为一个组件的应用程序.它最初是在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
Run Code Online (Sandbox Code Playgroud)
抛出错误的函数是:
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 }
Run Code Online (Sandbox Code Playgroud)
如您所见,所有这些函数都运行一个外部EXE帮助文件(由注册表项定位)和一些命令行参数,并设置一个Observer以异步等待响应并处理Exit代码.
该问题的行意味着Components.interfaces.nsIProcess2在FF3.6不再定义.它去了哪里?我在Mozilla文档中找不到任何内容,表明它已在最新版本中更改过.
nsIProcess2上的方法已移至nsIProcess.要使您的代码在两个版本中都有效,请更改以下行:
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess2);
Run Code Online (Sandbox Code Playgroud)
对此:
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess2 || Components.interfaces.nsIProcess);
Run Code Online (Sandbox Code Playgroud)
您仍然会收到警告,但错误将消失,您的代码在两个版本中都可以正常工作.您还可以将接口iid存储在变量中并使用变量:
let iid = ("nsIProcess2" in Components.interfaces) ?
Components.interfaces.nsIProcess2 :
Components.interfaces.nsIProcess;
otwProcess = Components.classes["@mozilla.org/process/util;1"]
.createInstance(iid);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
842 次 |
| 最近记录: |