Страницы: 1
Даа, не большой выбор. Но делать нечего, будем использовать то что есть. Буду ковыряться дальше. Большое спасибо за помощь.
Попробую, но по моему достичь желаемого результата не получится.:( А ты не пробывал так сделать... или делал ЛИБО плагин ЛИБО xpcom компоненту? Или может их действительно разделить по приложениям. Сделать отдельно плагин и отдельно компоненту. В плагин подключить хидеры компоненты и как нить попробывать выкрутиться...
Добавлено Wed May 28 17:03:08 2008 :
..и еще вопросик появился. Какие типы можно использовать в idl? Можно там всякие структуры, перечисления, массивы и т.п. передавать и получать в качестве параметров? Нормального мануала по этому вопросу я так и не нашел, а хотелось бы знать по конкретнее.
Ну, не знаю. Разве что попробовать зарегистрировать компоненту при инициализации плагина, или когда попросит скрипт.
Ооо, а это как?? Можно примерчик.
Я понял, что я не понял с самого начала.
А если плагиновской библиотеке добавить дополнительную точку входа NsGetModule, движок отыщет её при регистрации компонент ?
Вот, в том то и дело, что если добавить NSGetModule, по приложение даже не слинкуется. Или может руки кривые..., по крайней мере у меня не получилось добавить эту точку входа. Если бы все получилось, я думаю, что моего вопроса бы не возникло. Есть какие-нибудь идеи??
Это конечно все верно, но это относится непосредственно к плагину, к которому у меня вопросов нет. Все определенные мной методы прекрасно вызываются из ява скрипта, другое дело, что у меня не получается вернуть другую xpcom компоненту.
т.е.
embed.getMyInterface() - вызывается, но не возвращается компонента.
Если написать просто компоненту и зарегестрировать ее как модуль:
....
static nsModuleComponentInfo components[] =
{
{
SPECIALTHING_CLASSNAME,
SPECIALTHING_CID,
SPECIALTHING_CONTRACTID,
CSpecialThingConstructor,
},
{
MYCLASS_CLASSNAME,
MYCLASS_CID,
MYCLASS_CONTRACTID,
MyClassConstructor,
}
};
NS_IMPL_NSGETMODULE("SpecialThingsModule", components)
то браузер все прекрасно знает об этих компонентах. Но в плагине так же сделать нельзя, потому что это приложение совсем другого характера. Как мне сделать видимыми мои компоненты в плагине???
…Вернуть тому, что будет использомать этот плагин.
IDL:
[scriptable, uuid(A6B74332-9ADB-44c4-9C1A-B64F35B50324)]
interface IMyInterface: nsISupports {
attribute string Name;
};
[scriptable, uuid(d2d536a0-b6fc-11d5-9d10-0060b0fbd8ac)]
interface nsIScriptablePluginSample : nsISupports {
IMyInterface getMyInterface();
};
//native метод плагина, который возаращает IMyInterfase. Он нормально отрабатывает!!!
NS_IMETHODIMP nsScriptablePeer::GetMyInterface(IMyInterface **_retval)
{
MyClass* cl = new MyClass();//MyClass - реализует интерфейс IMyInterface
nsresult res = cl->QueryInterface(MyClass::GetIID(), (void**)&_retval);
if (NS_FAILED(res))
{
return NS_ERROR_INVALID_POINTER;
}
return NS_OK;
}
//стороне браузера
//вставляем плагин
<embed type="application/scriptable-plugin" width=600 height=40>
<script>
var embed = document.embeds[0];
var myI = embed.getMyInterface();
//в этом месте myI ровно null
alert(myI.Name);
</script>
Возник такой вопрос. Пишу плагин на С++, нужно из плагина вернуть xpcom объект. Как это сделать и желательно в одном проекте??. Из xpcom объекта вернуть другой xpcom объект у меня получилось, но вот ищ плагина как то не очень. Как можно это сделать?? Спасибо.
Ну в общем мне кажется я разобрался с этим вопросом. Кому интересно, ответ тут
http://praveenmatanam.wordpress.com/200 … xpconnect/
Могу предположить только, что 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. Все родное.
…Появился такой впорос, точнее непонимание. Существует 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)
{
Страницы: 1