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

Заказывай стафф с атрибутикой Mozilla и... пусть все вокруг завидуют тебе! Быть уникальным - быть с Mozilla!

№113-05-2008 16:12:53

_KDA_
Участник
 
Группа: Members
Зарегистрирован: 13-05-2008
Сообщений: 10
UA: IE 7.0

получение объектов из XPCom компоненты

Появился такой впорос, точнее непонимание. Существует xpcom кокпонент написанный на С++. Как я понимаю в idl файле можно описать множество интерфейсов и сделать столько же классов, которые будут реализовывать эти интерфейсы. В чем собственно проблема: как получить экземпляр класса(интерфеса) на JavaScript. Поясню примером:

есть описание интерфейсов
[scriptable, uuid(74A013CC-1AE3-4974-9856-FEF649C1BBFA)]
interface IMyInterface: nsISupports {
    attribute string Name;
};

[scriptable, uuid(263ed1ba-5cc1-11db-9673-00e08161165f)]
interface ISpecialThing : nsISupports //это собственно и есть компанента
{
   IMyInterface getMyInterface();
};


есть класс реализуйщий IMyInteface:

class MyClass: public IMyInterface
{
public:
  NS_DECL_ISUPPORTS
  NS_DECL_IMYINTERFACE

  MyClass();
  virtual ~MyClass();
  char* name;
};


и собственно функция, которая пытается вернуть ява сркрипту объект MyClass. Что то в этом роде:

NS_IMETHODIMP CSpecialThing::GetMyInterface(IMyInterface **_retval)
{
       MyClass* cl = new MyClass();
       nsresult res = cl->QueryInterface(kIMyInterfaceIID, (void**)&_retval);
       if (NS_FAILED(res))
       {
    return NS_ERROR_INVALID_POINTER;
       }
       return NS_OK;
}

Вот что получается на JavaScript
             try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
        const cid = "@starkravingfinkle.org/specialthing;1";
        obj = Components.classes[cid].createInstance();
        obj = obj.QueryInterface(Components.interfaces.ISpecialThing);
    } catch (err) {
        alert(err);
        return;
    }

    var myClass = obj.getMyInterface();              //после вызова этой функции объект myClass равен null!!??!?!?!
    if (myClass)
    {      
        alert(myClass.name);
    }


Что я не правильно сделал? Или это делается как то по другому??

Отсутствует

 

№213-05-2008 16:36:56

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: получение объектов из XPCom компоненты

Могу предположить только, что cl->QueryInterface не возвращает требуемый объект. Макрос NS_DECL_IMYINTERFACE определяет метод QueryInterface или только прототип ?


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№313-05-2008 16:58:23

_KDA_
Участник
 
Группа: Members
Зарегистрирован: 13-05-2008
Сообщений: 10
UA: IE 7.0

Re: получение объектов из XPCom компоненты

Anton пишет

Могу предположить только, что cl->QueryInterface не возвращает требуемый объект.

Я подключился дебагером, и посмотрел, что там происходит.
После выполнения это й строчки
nsresult res = cl->QueryInterface(kIMyInterfaceIID, (void**)&_retval);
в _retval, вроде расположено то что нужно. Т.е. там написано, что то типа: здесь лежит адрес, по котрому расположен объек типа MyClass. Все нормально. По крайней мере когда я писал ActivеX, при выполнении подобного кода никаких проблем не было. 

Макрос NS_DECL_IMYINTERFACE определяет метод QueryInterface или только прототип ?

Нет, этот макрос определяет прототипы функций, которые описаны непосредственно в итнерфейсе, а QI, addRef и Release определяет макрос NS_DECL_ISUPPORTS. А макрос NS_IMPL_ISUPPORTS1(MyClass, IMyInterface), определяет реализацию этих трех функций. Весь этот код генерится утилитой xpidl. Все родное.

Отсутствует

 

№414-05-2008 12:15:04

_KDA_
Участник
 
Группа: Members
Зарегистрирован: 13-05-2008
Сообщений: 10
UA: IE 7.0

Re: получение объектов из XPCom компоненты

Ну в общем мне кажется я разобрался с этим вопросом. Кому интересно, ответ тут
http://praveenmatanam.wordpress.com/200 … xpconnect/

Отсутствует

 

Board footer

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