Я так понял, что в return можно только макросы кидать типа NS_OK или error и.т.п.
а настоящий return это *_retval = char* например ?
Господа как вывести из функции тип char* - т.е. строку ?
Функция декларирована так
/* string GetData (); */
NS_SCRIPTABLE NS_IMETHOD GetData(char **_retval) = 0; - это в .h файле интерфейса
А вот так в .Idl файле
string GetData();
Т.е. вродебы возвращать она должна строку но в реализации так не выходит
получается только вернуть NS_OK .
В реализации этой функции я обращаюсь к глобальной переменной типа static char* variables ;
которую проверяю и если все ОК то должен выдать на return .....
но вот выдать на return не удается .
Почему? непонятно .......
Господа как лучше всего прилинковать модуль скажем outModul.h outModul.cpp к уже готовой компаненте состоящей из файлов
companentaModule.cpp
Icompanenta.idl
Icompanenta.h
companenta.h
companenta.cpp
В какой из этих .h файлов нужно вставить #include outModul.h что бы корректно расширить функционал ?
Со всеми UUid b scriptable все как раз в норме проверял сам не раз, однако смущает одна вещь - размер получившийся .so у меня 5.5Kb а у эталонного примеры 26kb .
Как видно это несколько не одинаковые файлы ..... если не сказать больше .
В связи с этим напрашивается вопрос а с теми ли ключами я компилил и собирал т.е. MakeFile у меня правильный или нет ?
Приведу MakeFile для внятности.
CXX = c++
PROJECT_FOLDER = /home/al/NetBeansProjects/_XPCOM/tst2/cpp2
SW_INC=/data/sites/xul_src/_mozilla/config/system_wrappers
CG_INC=/data/sites/xul_src/_mozilla/config/
XZ_ADD=-DOSTYPE=\"Linux2.6.18-92.1.18\" -DOSARCH=Linux
GECKO_SDK_PATH=/data/sites/xul_src/_mozilla/dist/sdk
APPEND_REW=/data/sites/xul_src/_mozilla/dist/include
BASE_REW=/data/sites/xul_src/_mozilla
XZ_ADD2=/data/sites/xul_src/_mozilla/dist
XZ_ADD3=/data/sites/xul_src/_mozilla/build/unix/gnu-ld-scripts
FILES_O = MyComponent.o
FILES = MyComponent.cpp MyComponentModule.cpp
TARGET = MyComponent.so
build:
# // worker modul
Господа, я уже задлбался регистрить компанент который не регистрится как его не крути ....
Причем непонятно почему точно такой же компанент с исходниками взятый как пример компилю MakFile и выполняю и все регистрится ....!
А мой компанент имеющий все точно такое же - с темже функционалом никак не регистрится хоть тресни .
Дело происходит на Linux-е С++ я взял пример состоящий из файла SimpleTest.cpp и nsISimpleTest.h как примеры
которые имеют структуру
SimpleTest.cpp
#include <stdio.h>
#include "nsISimpleTest.h"
#include "nsIGenericFactory.h"
class SimpleTest : public nsISimpleTest
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSISIMPLETEST
};
NS_IMPL_ISUPPORTS1(SimpleTest, nsISimpleTest)
NS_IMETHODIMP
SimpleTest::Add(PRInt32 a, PRInt32 b, PRInt32 *r)
{
printf("add(%d,%d) from C++\n", a, b);
*r = a + b;
return NS_OK;
}
NS_GENERIC_FACTORY_CONSTRUCTOR(SimpleTest)
// 5e14b432-37b6-4377-923b-c987418d8429
#define SIMPLETEST_CID \
{ 0x5e14b432, 0x37b6, 0x4
Спасибо большое за ответ на мой вопрос !
Я конечно же раскоментировал try блок но это не сильно помогло в решении задачи .
Выводится нечто вот такое
alert(Components.interfaces.IMyComponent); --- выводит " IMyComponent"
alert(cid) ; ---- "@mydomain.com/XPCOMSample/MyComponent;1"
alert(err); ------- "TypeError: Components.classes[cid] is undefined"
КАК ЖЕ ЕГО ЗАРЕГИСТРИРОВАТЬ ?????
По каким причинам может не создаваться (прописываться) в compreg.dat CLASSID ?
Можно ли как то принудительно туда прописать ?
Вот file.js который вызывает компонент на выполнение в нем я с помощью alert(obj); проверяю наличие объекта как вы и указывали в предыдущем посту.
Но дело в том, что этот скрипт ничего не выводит ни сообщения связанные с obj ни сообщения об ошибке ничего .....
в xpti.dat - интерфейс прописан а вот в compreg.dat ничего нет .....
[code]// вызов теста компанента
function MyComponentTest()
{
var obj = null;
try
// {
//alert(Components.interfaces.IMyComponent);
// По Contract ID получаем доступ к модулю
const cid = "@mydomain.com/XPCOMSample/MyComponent;1";
obj = Components.classes[cid].createInstance(Components.interfaces.IMyComponent);
alert(obj);
// Получаем указатель на объект нашего интерфейса
obj = obj.QueryInterface(Components.interfaces.IMyComponent);
/* }
catch(err)
{
alert("MyComponent ERROR") ;
alert(cid) ;
alert(err);
return;
}
*/
// Вызываем наш метод д
Здравствуйте уважаемые !
Хотел бы прояснить вопрос у знающих людей.
А именно - что создает файлы xpti.dat и compreg.dat ?
Меня не ясно почему в xpti.dat пишется создание интерфейса IMycomponent
а в compreg.dat не пишится ни компонент ни интерфейс ??????
С Какой библиотекой хоть бы узнать он связан ?
Может кто сталкивался уже ?
Господа, ктонибудь занет почему Xulrunner при запуске ругается на подобный модуль - непонятно откуда ноги ростут .....?
undefined symbol: _Z20NS_NewGenericModule2PK12nsModuleInfoPP9nsIModule
В этой строке obj получает 0 ....!
obj = Components.classes[cid].createInstance()
Тогда вопрос- Components.classes с чем связан и где искать ошибку которая связана с этим интерфейсом ?
Я предпологаю что компанент не зарегистрирован просто .
Господа как зарегистрировать компанент состаящий из file.xpt и file.so ?
Здравствуйте господа !
Хотел бы поинтересоваться у знающих людей как правильно зарегистрировать компонент XPCOM в LINUX-е ?
Написнный на С++ скомпиленный и вроде как работающий но вот при вызове из JavaScript выдает ошибку о ненахождении класса компонента .
ВЫЗЫВАЕТСЯ ТАК
try
{
// По Contract ID получаем доступ к модулю
const cid = "@mydomain.com/XPCOMSample/MyComponent;1";
obj = Components.classes[cid].createInstance();
// Получаем указатель на объект нашего интерфейса
obj = obj.QueryInterface(Components.interfaces.IMyComponent);
}
catch(err)
{
alert(err);
return;
}
РУГАЕТСЯ ТАК :
Error: Permission denied to get property XPCComponents.classes ????!
То есть запускается catch(err)
Господа, собираю проект XPCOM компанента все вроде правильно но линковщик ругается на библиотеки которые предствлены в SDK
И выглядет это следующим образом ....
Сообщение G++
/usr/bin/ld: skipping incompatible /home/al/NetBeansProjects/XPCOM/gecko/lib/libxpcomglue_s.a when searching for -lxpcomglue_s
/usr/bin/ld: cannot find -lxpcomglue_s
collect2: выполнение ld завершилось с кодом возврата 1
А вот на что он ругается :
GECKO_LDFLAGS = -L $(GECKO_SDK_PATH)/lib -lxpcomglue_s -lxul -lxpcom -lplds4 -lplc4 -lnspr4 -lpthrea
Т.Е. он видит вместо библиотек представленых в SDK таких как libxpcomglue_s .... ключи которые для сборки прописаны в Makefile т.е.
-lxpcomglue_s -lxul -lxpcom -lplds4 -lplc4 -lnspr4 -lpthrea
Вопрос что надо прописать в строке линковщика для того чтобы все собралось ?
Все пути наместе и тут нареканий нет .
У меня тут господа вопрос из разряда "ЧТО ЭТО БЫЛО" .
Компилятор говорит, что процесс завершился с кодом 1
и говорит что не нашел -lxpcomglue_s в библиотеке libxpcomglue_s.a .
А что такое -lxpcomglue_s ? И счем его есть ? Где Искать ?
libxpcomglue_s.a when searching for -lxpcomglue_s
/usr/bin/ld: cannot find -lxpcomglue_s
Господа нашел где затаилась ошибка -> {0xa55bd0a3, 0x1f72, 0x4803 {0xbb,
^^^^
небыло запятой оказывается !
И не подумаешь, что может запятая не поставленная вовремя!
Если бы так просто уже нашел бы .....
На этом месте числится MY_COMPONENT_CID
Может сам идентификатор не нравится ?
Мне слегка не понятен сам принцип его записи :
#define MY_COMPONENT_CID {0xa55bd0a3, 0x1f72, 0x4803 {0xbb, 0x50, 0xf6, 0x52, 0xc4, 0x7a, 0xfb, 0x66}}
Почему то нужно его разделять на разные сигменты и заключать в несколько скобок {.......{..........}} ?????
Вот такие ошибки выдаются по неизвестной мне причине может кто сталкивался с подобным
?
MyComponentModule.cpp:10: ошибка: expected `}' before ‘{’ token
MyComponentModule.cpp:10: ошибка: expected `}' before ‘{’ token
MyComponentModule.cpp:10: предупреждение: missing braces around initializer for ‘nsModuleComponentInfo’
MyComponentModule.cpp:10: ошибка: expected ‘,’ or ‘;’ before ‘{’ token
MyComponentModule.cpp:10: ошибка: expected declaration before ‘}’ token
Содержимое файла MyComponentModule.cpp:
#include "nsIGenericFactory.h"
#include "MyComponent.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)
static nsModuleComponentInfo components[] =
{
{
MY_COMPONENT_CLASSNAME,
MY_COMPONENT_CID,
MY_COMPONENT_CONTRACTID,
MyComponentConstructor,
}
};
NS_IMPL_NSGETMODULE("MyComponentsModule", components)
…Это ясно что ноги оттуда ростут но не ясно почему .
Вроде все норма в этом файле незнаю с какой стороны и подъехать к проблеме.
Господа, я начал понимать, что чегото не понимаю я взял пример простейшего XPCOM компонента по адресу
http://www.linux.org.ru/wiki/en/XUL_XPCOM и попытался его скомпилить как в статье по этому адресу описано .
Компилил G++ в строгом соответствии с путями и наличием необходимых SDK .
Процесс протекал на LINUX RED HUT
И как же ябыл удивлен увидем такое колличество ошибок !?
g++ -Wall -Os -o MyComponent.so -include mozilla-config.h -DXPCOM_GLUE -DXPCOM_GLUE_USE_NSPR -I /home/al/NetBeansProjects/XPCOM/gecko/include -I/home/al/NetBeansProjects/XPCOM -fno-rtti -fno-exceptions -shared -L /home/al/NetBeansProjects/XPCOM/gecko/lib -lxpcomglue_s -lxul -lxpcom -lplds4 -lplc4 -lnspr4 -lpthrea MyComponent.cpp MyComponentModule.cpp
In file included from MyComponent.h:3,
from MyComponent.cpp:1:
IMyComponent.h:9:19: warning: extra tokens at end of #ifndef directive
IMyComponent.h:36:63: error: macro "NS_DEFINE_STATIC_IID_ACCESSOR" passed 2 arguments, but t
Здравствуйте !
Я тут как вы и советовали занялся самым не благодарным делом - а именно компиляцией этого чуда.
В примере компанента описан Makfile http://www.linux.org.ru/wiki/en/XUL_XPCOM#Makefile
В котором конечно же использованы пути которые никак к моей системе не относятся , это понятно но не ясно другое :
после применения исправленого Makefile мне вываливается вот такая ошибка -
g++ -Wall -O2 -o MyComponent.so -include mozilla-config.h -DXPCOM_GLUE -DXPCOM_GLUE_USE_NSPR -I/data/sites/xul_src/mozilla/xpcom /base -I/data/sites/xul_src/mozilla/xpcom /components -fno-rtti -fno-exceptions -shared (FILES) -L/data/sites/xulrunner -lxpcomglue_s -lxul -lxpcom -lplds4 -lplc4 -lnspr4 -lpthrea FILES = MyComponent.cpp MyComponentModule.cppTARGET := MyComponent.so
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `g++ -Wall -O2 -o MyComponent.so -include mozilla-config.h -DXPCOM
А если сервака нет и развернуть его нет возможности .
То как обращаться к приложению ?
Притом это приложение не консольное - это .so т.е. библиотека .
Я почему про XPCOM и заговорил , только с помощью него можно подцепиться по типу COM объекта как в WINDOWS-e
Вот я и спрашиваю может уже есть подобный XPCOM компонент скомпилированный к нему в интерфейс тока прописать мой функционал который будет вызываться JavaScript-ом ?
Но тогда как сделать UIN для этого интерфейса и как его зарегистрировать в системе?
Я сильно извиняюсь за то что ввел вас в заблуждение конечно же пользователь будет использовать прогу локально на своем Firefox-е но суть от этого не меняется JavaScript передает проге некий поток char -ов скажем и поток обработав, прога отдает результат в FireFox обратно.
Задача состоит в том что прога стоит в сети(локальной) и начальник или другой ЮЗВЕРЬ может нажав на ссылке с помощью JavaScripta запустить прогу передав ей как входные данные поток .
Господа речь идет как раз про LINUX и как я понял из доки по XPCOM самое неприятное и сложное при создании XPCOM компонента это уникальный UID который потом используется в .idl для регистрации компонента в системе.
прога лежит конечно же в инете а JavaScript удаленно в сети .
Я просто никак представить не могу как максимально просто и быстро реализовать XPCOM и включить в него свою прогу.