>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >XPCOM NS_NOINERFACE http://forum.mozilla-russia.org/viewtopic.php?id=35418 |
MicroHard > 30-05-2009 11:00:38 |
Здравствуйте, уважаемые специалисты. Меня тут посадили отлаживать XPCOM с++ код. При попытке сделать вот это:
из JavaScript (XUL приложение) вылетает JavaScript Exeption "Component returned failure code: 0x80004002 NS_NOINTERFACE. И это при том, что при компиляции в .idl файле этот интерфес прописан. В чём тут может быть дело? Какие варианты? Помогите новичку пожалуйста - гуглю уже полдня. |
Crazy-EyE > 30-05-2009 15:23:08 |
Проблема не в том, что интерфейса нет вообще (idl тут ни при чем). Просто данный конкретный объект obj не поддерживает этот интерфейс. |
MicroHard > 30-05-2009 15:43:13 |
Спасибо. А можно ли как-то получить список интерфейсов, которые поддерживаются данным объектом? Как обычно решаются такие проблемы людьми знающими? |
Crazy-EyE > 30-05-2009 16:08:42 |
Обычно понятно, какой компонент что умеет. Это обычно написано или в коде, или в доках. Насколько я себе всё представляю, список поддерживаемых интрфейсов "хранится" в реализации функции QueryInterface, но она может только сказать, есть интерфейс или нет. Теоретически можно попробовать пройтись по ВСЕМ интерфейсам (из Components.interfaces) и попытаться сделать для каждого QueryInterface. Может просто obj - это просто не тот объект. Или еще может быть ошибка в реализации QueryInterface (например, если компонент написан на JS, надо обычно писать QueryInterface самому) |
MicroHard > 30-05-2009 16:44:20 |
Ситуация на самом деле весьма забавная. var obj = Components.classes["@component.com/notificationservice;1"].createInstance(); то в отладчике MSVC++ 2005 встаю на конструкторе nsQRENotificationService а потом на вот этой строчке в глобальной области - NS_IMPL_ISUPPORTS1(nsQRENotificationService, nsIQRENotificationService) - раз 10 подряд я здесь встаю. Потом яваскрипт доходит до следующей строчки: aveConnection = obj.QueryInterface(Components.interfaces.nsIQRENotificationService); после этого я раз 6 встаю на той же самой NS_IMPL_ISUPPORTS1(nsQRENotificationService, nsIQRENotificationService) в плюсовом отладчике. То есть конструктор нужного мне класса выполнился, но интерфейса для него почему-то нет. Что тут можно зделать? |
Crazy-EyE > 30-05-2009 17:00:09 |
Вообще странно. NS_IMPL_ISUPPORTS1 как раз включает в себя стандартную реализацию QueryInterface, поэтому всё должно работать нормально. А Components.interfaces.nsIQRENotificationService вообще определен? Проще всего зайти в консоль JS-ошибок, нажать при необходимости "очистить", потом в строке выполнить команды Выделить код Код:Components.interfaces.nsIQRENotificationService Components.interfaces.nsIQRENotificationService == undefined Должно выдать соответственно nsIQRENotificationService и false. А Выделить код Код:Components.classes["@component.com/notificationservice;1"].createInstance(Components.interfaces.nsIQRENotificationService) работает? (Скорее всего будет та же ошибка). А ? |
MicroHard > 30-05-2009 17:15:41 |
Спасибо что помогаете вот это работает на вот этом Выделить код Код:Components.classes["@component.com/notificationservice;1"].createInstance(Components.interfaces.nsIQRENotificationService) падает с ошибкой Exeption "Component returned failure code 0x80570015 NS_ERROR_XPC_CI_RETURNED_FAILURE 30-05-2009 17:33:25 а выдаёт false |
MicroHard > 30-05-2009 22:01:40 |
Друзья, проблема решилась! Я просто заново повторил все стандартные процедуры по созданию xpcom с++ компонентов. В любом случае, Crazy-EyE отдельная благодарность - теперь я отношусь к коду XPCOM более осмысленно и умею пользоваться jsconsole |