Страницы: 1
Появился такой впорос, точнее непонимание. Существует 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);
}
Что я не правильно сделал? Или это делается как то по другому??
Отсутствует
Могу предположить только, что cl->QueryInterface не возвращает требуемый объект. Макрос NS_DECL_IMYINTERFACE определяет метод QueryInterface или только прототип ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Могу предположить только, что 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. Все родное.
Отсутствует
Ну в общем мне кажется я разобрался с этим вопросом. Кому интересно, ответ тут
http://praveenmatanam.wordpress.com/200 … xpconnect/
Отсутствует
Страницы: 1