>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >XPCOM: Определить класс http://forum.mozilla-russia.org/viewtopic.php?id=39776 |
Keepun > 13-09-2009 01:17:44 |
Как узнать к какому классу относится интерфейс, например, nsIFile? |
zibloid > 13-09-2009 09:26:04 |
Можно тут посмареть : http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/interfaces/ |
Keepun > 15-09-2009 21:48:06 |
Хочу получить простой, но полный список классов и компонентов. Но я застрял в самом... странном месте. "document.writeln" для XUL не существует. Начал искать вариант и наткнулся на объект EDITOR, но так и не понял, как текст в него пихать. |
Forest > 16-09-2009 10:22:26 |
Keepun Keepun пишет
dump и включить консоль. |
Crazy-EyE > 16-09-2009 15:04:28 |
Можно открыть пустую вкладку (руками) и дописывать в нее: А вообще в Extension Developer есть JavaScript shell - очень удобно в таких случаях. |
Keepun > 16-09-2009 20:33:18 |
OK, c Javascript Shell разобрался... Такой код: Выделить код Код:var CInf = Components.classes['@mozilla.org/timer;1'].QueryInterface(Components.interfaces.nsIClassInfo); var CiC, CiR; CInf.getInterfaces(CiC, CiR); document.writeln("+++ "+ CiC +"<br>"); Ошибка: Выделить код Код:NS_ERROR_XPC_NEED_OUT_OBJECT on line 3: 'Out' argument must be an object arg 0 [nsIClassInfo.getInterfaces Что ему надо? Какой объект? |
Crazy-EyE > 16-09-2009 20:59:07 |
Выделить код Код:void getInterfaces(out PRUint32 count, [array, size_is(count), retval] out nsIIDPtr array); Второй параметр out+retval, т.е. из JavaScript он будет виден не как второй параметр функции, а как её возвращаемое значение. Чтобы получить первый out-параметр, надо передать этой функции объект, и она заполнит в нем поле value в данном случае размером массива (иммитация передачи по ссылке, используемая XPConnect при вызове методов XPCOM-интерфейса из JavaScript). Но в JavaScript не нужно отдельно знать размер массива - он будет в CiR.length автоматически (XPConnect всё сделает сам), поэтому передаем пустой анонимный объект. Выделить код Код:var CInf = Components.classes['@mozilla.org/timer;1'].QueryInterface(Components.interfaces.nsIClassInfo); var CiR = CInf.getInterfaces({}); document.writeln("+++ "+ CiC +"<br>"); |
Keepun > 16-09-2009 23:47:41 |
Не пашет CInf.getInterfaces({})... одно и тоже выдает Выделить код Код:var CInf = Components.classes['@mozilla.org/file/local;1'].QueryInterface(Components.interfaces.nsIClassInfo); for each(var Cc in CInf.getInterfaces({})) document.writeln("+++ "+ Components.interfacesByID[Cc].name +" ::: "+ Cc +"<br>"); Независимо от класса получу: Выделить код Код:+++ nsIJSID ::: {baedc96a-9cee-4b6b-9160-90d257b3c8ef} +++ nsIJSCID ::: {26b2a374-6eaf-46d4-acaf-1c6be152d36b} |
Crazy-EyE > 17-09-2009 00:24:26 |
Надо же еще получить сам объект: Выделить код Код:Components.classes["@mozilla.org/browser/sessionstore;1"].getService(Components.interfaces.nsIClassInfo).getInterfaces({}) Причем для некоторых компонентов надо вызывать createInstance, а не getService. И похоже, большинство компонентов, написанных на С++, не поддерживают nsIClassInfo. |