Страницы: 1
Здравствуйте, уважаемые специалисты.
Меня тут посадили отлаживать XPCOM с++ код.
При попытке сделать вот это:
aveConnection = obj.QueryInterface(Components.interfaces.nsIQRENotificationService);
из JavaScript (XUL приложение) вылетает JavaScript Exeption
"Component returned failure code: 0x80004002 NS_NOINTERFACE.
И это при том, что при компиляции в .idl файле этот интерфес прописан.
В чём тут может быть дело? Какие варианты? Помогите новичку пожалуйста - гуглю уже полдня.
Отсутствует
Спасибо. А можно ли как-то получить список интерфейсов, которые поддерживаются данным объектом? Как обычно решаются такие проблемы людьми знающими?
Отредактировано MicroHard (30-05-2009 15:44:37)
Отсутствует
Обычно понятно, какой компонент что умеет. Это обычно написано или в коде, или в доках.
Насколько я себе всё представляю, список поддерживаемых интрфейсов "хранится" в реализации функции QueryInterface, но она может только сказать, есть интерфейс или нет. Теоретически можно попробовать пройтись по ВСЕМ интерфейсам (из Components.interfaces) и попытаться сделать для каждого QueryInterface.
Может просто obj - это просто не тот объект. Или еще может быть ошибка в реализации QueryInterface (например, если компонент написан на JS, надо обычно писать QueryInterface самому)
Отсутствует
Ситуация на самом деле весьма забавная.
когда я из яваскрипта делаю
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)
в плюсовом отладчике.
То есть конструктор нужного мне класса выполнился, но интерфейса для него почему-то нет. Что тут можно зделать?
Отсутствует
Вообще странно. 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)
работает? (Скорее всего будет та же ошибка). А
?
Отсутствует
Спасибо что помогаете
вот это
работает
на вот этом
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
В jsconsole
а
выдаёт false
Отредактировано MicroHard (30-05-2009 17:16:19)
Отсутствует
Друзья, проблема решилась! Я просто заново повторил все стандартные процедуры по созданию xpcom с++ компонентов. В любом случае, Crazy-EyE отдельная благодарность - теперь я отношусь к коду XPCOM более осмысленно и умею пользоваться jsconsole
Отсутствует
Страницы: 1