Полезная информация

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№130-05-2009 11:00:38

MicroHard
Участник
 
Группа: Members
Зарегистрирован: 04-04-2009
Сообщений: 10
UA: Firefox 3.0

XPCOM NS_NOINERFACE

Здравствуйте, уважаемые специалисты.

Меня тут посадили отлаживать XPCOM с++ код.

При попытке сделать вот это:

aveConnection = obj.QueryInterface(Components.interfaces.nsIQRENotificationService);

из JavaScript (XUL приложение) вылетает JavaScript Exeption

"Component returned failure code: 0x80004002 NS_NOINTERFACE.

И это при том, что при компиляции в .idl файле этот интерфес прописан.

В чём тут может быть дело? Какие варианты? Помогите новичку пожалуйста - гуглю уже полдня.

Отсутствует

 

№230-05-2009 15:23:08

Crazy-EyE
Участник
 
Группа: Members
Зарегистрирован: 20-06-2008
Сообщений: 81
UA: Firefox 3.0

Re: XPCOM NS_NOINERFACE

Проблема не в том, что интерфейса нет вообще (idl тут ни при чем). Просто данный конкретный объект obj не поддерживает этот интерфейс.

Отсутствует

 

№330-05-2009 15:43:13

MicroHard
Участник
 
Группа: Members
Зарегистрирован: 04-04-2009
Сообщений: 10
UA: Firefox 3.0

Re: XPCOM NS_NOINERFACE

Спасибо. А можно ли как-то получить список интерфейсов, которые поддерживаются данным объектом? Как обычно решаются такие проблемы людьми знающими?

Отредактировано MicroHard (30-05-2009 15:44:37)

Отсутствует

 

№430-05-2009 16:08:42

Crazy-EyE
Участник
 
Группа: Members
Зарегистрирован: 20-06-2008
Сообщений: 81
UA: Firefox 3.0

Re: XPCOM NS_NOINERFACE

Обычно понятно, какой компонент что умеет. Это обычно написано или в коде, или в доках.

Насколько я себе всё представляю, список поддерживаемых интрфейсов "хранится" в реализации функции QueryInterface, но она может только сказать, есть интерфейс или нет. Теоретически можно попробовать пройтись по ВСЕМ интерфейсам (из Components.interfaces) и попытаться сделать для каждого QueryInterface.

Может просто obj - это просто не тот объект. Или еще может быть ошибка в реализации QueryInterface (например, если компонент написан на JS, надо обычно писать QueryInterface самому)

Отсутствует

 

№530-05-2009 16:44:20

MicroHard
Участник
 
Группа: Members
Зарегистрирован: 04-04-2009
Сообщений: 10
UA: Firefox 3.0

Re: XPCOM NS_NOINERFACE

Ситуация на самом деле весьма забавная.
когда я из яваскрипта делаю

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)

в плюсовом отладчике.

То есть конструктор нужного мне класса выполнился, но интерфейса для него почему-то нет. Что тут можно зделать?

Отсутствует

 

№630-05-2009 17:00:09

Crazy-EyE
Участник
 
Группа: Members
Зарегистрирован: 20-06-2008
Сообщений: 81
UA: Firefox 3.0

Re: XPCOM NS_NOINERFACE

Вообще странно. 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)

работает? (Скорее всего будет та же ошибка). А

Выделить код

Код:

obj.QueryInterface(Components.interfaces.nsISupports)

?

Отсутствует

 

№730-05-2009 17:15:41

MicroHard
Участник
 
Группа: Members
Зарегистрирован: 04-04-2009
Сообщений: 10
UA: Firefox 3.0

Re: XPCOM NS_NOINERFACE

Спасибо что помогаете :)

вот это

Выделить код

Код:

obj.QueryInterface(Components.interfaces.nsISupports)

работает

на вот этом

Выделить код

Код:

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

Выделить код

Код:

Components.interfaces.nsIQRENotificationService - определяется

а

Выделить код

Код:

Components.interfaces.nsIQRENotificationService==undefined

выдаёт false

Отредактировано MicroHard (30-05-2009 17:16:19)

Отсутствует

 

№830-05-2009 22:01:40

MicroHard
Участник
 
Группа: Members
Зарегистрирован: 04-04-2009
Сообщений: 10
UA: Firefox 3.0

Re: XPCOM NS_NOINERFACE

Друзья, проблема решилась! Я просто заново повторил все стандартные процедуры по созданию xpcom с++ компонентов. В любом случае, Crazy-EyE отдельная благодарность - теперь я отношусь к коду XPCOM более осмысленно и умею пользоваться jsconsole :)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]