components.interfaces.nsiprocess2 في فايرفوكس 3.6 - أين ذهبت؟

StackOverflow https://stackoverflow.com/questions/2221469

  •  19-09-2019
  •  | 
  •  

سؤال

أنا تجريبي اختبار تطبيق يتضمن ملحق فايرفوكس كمكون واحد. تم نشره في الأصل عندما كان 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 (موجود من قبل مفتاح التسجيل) مع بعض معلمات سطر الأوامر وإعداد مراقب للانتظار بشكل غير متزامن للاستجابة ومعالجة رمز الخروج.

الخط المخالف يعني ذلك مكونات.IndFaces.nsiprocess2. لم يعد محدد في FF3.6. اين ذهبت؟ لا يمكنني العثور على أي شيء في وثائق Mozilla التي تشير إلى أنه قد تم تغييره في أحدث إصدار.

هل كانت مفيدة؟

المحلول

تم نقل الطريقة على 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top