Xpoint
   [напомнить пароль]

подключение XPCOM с FireFox

Метки: [без меток]
[арх]
2007-04-29 10:07:12 [обр] Luciefer[досье]
Возникла проблема при выполнении примера http://www.iosart.com/firefox/xpcom/
.xpl файл создал
.dll файл создал
зарегистрировал компонент как
regxpcom -x "C:\program files\mozilla....\components"
программа ничего не сматерилась
удалил xpti.dat, compreg.dat
Но при запуске HTML пишется, что необходимый модель не установлен
Помогите..что делать, куда лезть?
спустя 3 часа 19 минут [обр] Данил Иванов(5/30)[досье]
  1. regxpcom не нужен.
  2. xpl - опечатка? xpt нужен.
  3. для проверки работоспособности компоненты положите .xpt и .dll в components (каталог где установлен Fx) и удалите xpti.dat, compreg.dat из каталога профиля пользователя.
спустя 1 час 14 минут [обр] Luciefer[досье]
  1. в примере написано, что нужен...но я сам не знаю :)
  2. да, сорри опечатка
  3. положил, удалил...ничего

в xpti.dat компонент добавился, а в compreg.dat нет
P.S. и там и там искал как MyComponent

спасибо за ответ, но пока не результатов :(

спустя 1 час 35 минут [обр] Владимир Палант(434/4445)[досье]

Это старая статья, следует качать актуальный SDK:
http://releases.mozilla.org/pu......ulrunner/releases/1.8.0.4/sdk/ или даже http://releases.mozilla.org/pu....../releases/1.8.1.3/contrib/sdk/ (название изменилось с Gecko SDK на XULRunner SDK)

Далее, чтобы зарегистрировать новые компоненты, и удалять ничего не надо — в профиле пользователя просто создается файл .autoreg (содержание не важно).

Попробовал откомпилировать пример с актуальным SDK, скопировал и зарегистрировал компоненты. Этот код нормально выполняется:

var result = Components.classes['@mydomain.com/XPCOMSample/MyComponent;1']
                       .createInstance(Components.interfaces.IMyComponent)
                       .Add(3, 4);
alert(result);

Как ни странно, показывает 7 :)

спустя 1 час 29 минут [обр] Luciefer[досье]

Сделал вот такой .mak файл http://slil.ru/24307835
поставил новый SDK
Запустил "D:\program files\microsoft visual studio 8\vc\bin\nmake.exe" /f "D:\xpcom-sample\src\MyComponent.mak"
Теперь сильно матерится на этот пример:

Microsoft (R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.

No configuration specified. Defaulting to MyComponent - Win32 Debug.
        "D:\program files\microsoft visual studio 8\vc\bin\link.exe" @C:\DOCUME~
1\Igor\LOCALS~1\Temp\nm9E1.tmp
MyComponent.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF'
 specification
   Creating library .\Debug\MyComponent.lib and object .\Debug\MyComponent.exp
MyComponentModule.obj : error LNK2019: unresolved external symbol "unsigned int
__cdecl NS_NewGenericModule2(struct nsModuleInfo const *,class nsIModule * *)" (
?NS_NewGenericModule2@@YAIPBUnsModuleInfo@@PAPAVnsIModule@@@Z) referenced in fun
ction _NSGetModule
.\Debug\MyComponent.dll : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"D:\program files\microsoft visual studio 8\vc\bin\l
ink.exe"' : return code '0x460'
Stop.

Теперь вообще не понимаю в чем дело :(

спустя 39 минут [обр] Владимир Палант(434/4445)[досье]
Замените xpcomglue.lib на xpcomglue_s.lib и добавьте xpcom.lib.
спустя 5 часов [обр] Luciefer[досье]

Владимир Палант, спасибо за помощь.

Подключил эти файлы.
Примерно вот так прошел процесс компиляции:


cl : Command line warning D9002 : ignoring unknown option '/YX'
MyComponent.cpp
        "D:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.exe" @C:\DOCUME~1Igor\LOCALS~1\Temp\nmB3.tmp
cl : Command line warning D9002 : ignoring unknown option '/YX'
MyComponentModule.cpp
        "D:\program files\microsoft visual studio 8\vc\bin\link.exe" @C:\DOCUME~
1\Igor\LOCALS~1\Temp\nmB4.tmp
MyComponent.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF'
 specification
   Creating library .\Debug\MyComponent.lib and object .\Debug\MyComponent.exp
        "D:\program files\microsoft visual studio 8\vc\bin\bscmake.exe" @C:\DOCU
ME~1\Igor\LOCALS~1\Temp\nmB6.tmp


Полученный dll и xpt файлы я положил в папку components
Создал файл .autoreg (с содержимым: '1') и запустил Mozilla Firefox.
В файле xpti.dat имееются элементы IMyComponent, а в compreg.dat похожих элементов нет (ни MyComponent, ни IMyComponent).

При запуске тестового html и нажатии Go выдает ошибку [Приложение JavaScript] TypeError: Components.classes[cid] has no properties.

Как я понимаю, плагин так и не подключился :(

P.S. на всякий случай выложил в сеть мою папку с mak, dll, xpt и подобными файлами проекта, и полученными xpti.dat compreg.dat файлами: http://luciefer.nm.ru/XPCOM/

спустя 31 минуту [обр] Владимир Палант(434/4445)[досье]
сообщение промодерировано
У меня с вашим DLL выдается сообщение, что библиотека пытается неправильно загрузить MSVCRT. У себя я компилирую MSVCRT статически, чтобы не было проблем с зависимостями. Добавьте флаг компиляции /MT. Теоретически этого должно быть достаточно, но мне почему-то пришлось использовать еще /NODEFAULTLIB и добавить libcmt.lib в список библиотек вручную.
спустя 8 часов [обр] Luciefer[досье]

В строку CPP_PROJ= вместо /MD записал флаг /MT (когда было и то и то, писалось, что конфликтуют)
в LINK32_FLAGS= добавил /NODEFAULTLIB и libcmt.lib
При компиляции на экране все так же, без изменений.

Итог точно такой же. В compreg.dat ничего не добавилось, пример не работает :(

Свои файлы обновил по http://luciefer.nm.ru/XPCOM/

P.S. еще раз спасибо, что помогаете...мне очень нужно запустить этот пример

спустя 52 минуты [обр] Luciefer[досье]

Как я понял, я не правельно добавил /nodefaultlib, изменил на /notedefaultlib:libcmt.lib и закинул этот файл в папку с link.exe
но все равно, без измененний... :(

Измененные файлы выложил как архив с номером 2

спустя 9 минут [обр] Владимир Палант(434/4445)[досье]
сообщение промодерировано
Я вижу только старый архив. В нем MyComponent.dll все еще зависит от msvcr80.dll.
спустя 24 минуты [обр] Luciefer[досье]
действительно почему-то старый
закинул новый
но как мне кажется, я так и не понимаю как убрать зависимость
спустя 38 минут [обр] Luciefer[досье]
я так понимаю, строчки в конце dll файла информируют о зависимости?
тогда она все еще сохранилась..
спустя 9 минут [обр] Владимир Палант(434/4445)[досье]
Да, у меня все то же сообщение. Должно быть не /nodefaultlib:libcmt.lib, а именно /nodefaultlib и libcmt.lib в списке библиотек.
спустя 13 минут [обр] Luciefer[досье]

Переделал.
Все равно такая же строчка остается в dll.
Может все библиотеки надо скинуть в одну папку? хотя я их достаточно долго собирал ссылками со всего винчестера.

полученный файлы обновил http://luciefer.nm.ru/XPCOM/

P.S. или может дело в этом? "cl : Command line warning D9002 : ignoring unknown option '/YX'"

спустя 29 минут [обр] Владимир Палант(434/4445)[досье]
Попробовал с вашим mak-файлом создать не Debug, а Release — и всё заработало.
спустя 38 минут [обр] Владимир Палант(434/4445)[досье]
Пояснение: дело не в том, что дебаговая версия не работает в принципе. У себя я иногда добавляю флаг /Zi, и ничего от этого не ломается. Смотрю mak-файл — в дебаговой версии в списке библиотек числятся msvcrt.lib и msvcrtd.lib. Думаю, что дело в этом.
спустя 50 минут [обр] Luciefer[досье]
заработало, СПАСИБО!!!!!!!!!!!!!!
спустя 4 месяца 14 дней [обр] Eugene[досье]

Аналогичная проблема с передачей строки из JavaScript в .dll и обратно.
На основе этого примера, который здесь обсуждается ( http://www.iosart.com/firefox/xpcom/), создан .idl файл
Содержание:
#include "nsISupports.idl"

[scriptable, uuid(xxxxxxxxxxxxxxxxxxxxxx)]
interface IMyTestComp:nsISupports
{
   long Add(in long a, in long b);

   readonly attribute AString clientConnected;
    
// AString carsByGroup(in AString groupname);
    void carsByGroup(in AString groupname, out AString carsarray);
};
Сишные функции;
/* readonly attribute AString clientConnected; */
NS_IMETHODIMP MyTestComp::GetClientConnected(nsAString & aClientConnected)
{
      tl_connected = 1;
      NS_NAMED_LITERAL_STRING(myStr, "Пользователь имя1 ");
      aClientConnected.Assign(myStr); // modifies the string
   return NS_OK;
}

/* void carsByGroup (in AString groupname, out AString carsarray); */
NS_IMETHODIMP MyTestComp::CarsByGroup(const nsAString & groupname, nsAString & carsarray)
{
   char *val = "car1";
                     
NS_NAMED_LITERAL_STRING(myStr, "");
   carsarray.Assign(myStr); // modifies the string
   carsarray.Append(NS_ConvertASCIItoUTF16(val));

   return NS_OK;
}
И Java скрипт:
function MyTestConnectToServer() {
   try {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      const cid = "@yline.ru/MyTest/MyTestComp;1";
      obj = Components.classes[cid].createInstance();
      obj = obj.QueryInterface(Components.interfaces.IMyTestComp);
      
} catch (err) {
      alert('Îøèáêà ïðèëîæåíèÿ; ' + err);
      return;
   }
   var res = obj.clientConnected;
   alert('Пользователь ' + res + ' подключен к MyTest.');
}
и вторая функция

function MyTest_KeyGroup(event)
{
    // Was the key that was pressed [ENTER]? If so, perform a web search.
    if(event.keyCode == event.DOM_VK_RETURN) {

       var isEmpty = false;
       // Get a handle to our search terms box (the <menulist> element)
       var groupTermsBox = document.getElementById("MyTest-GroupMenu");
       
// Get the value in the search terms box, trimming whitespace as necessary
       // See the MyTest_TrimString() function farther down in this file for details
       // on how it works.
       var groupTerms = MyTest_TrimString(groupTermsBox.value);
// var groupKey = MyTest_TrimString(groupTermsBox.key);
       
if(groupTerms.length == 0) // Is the search terms box empty?
           isEmpty = true; // If so, set the isEmpty flag to true
   
if(!(isEmpty)) {
          alert('смотрим: ' + groupTerms); // здесь видим правильно
         try {
            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            const cid = "@yline.ru/MyTest/MyTestComp;1";
            obj = Components.classes[cid].createInstance();
            obj = obj.QueryInterface(Components.interfaces.IMyTestComp);
         } catch (err) {
            alert('Îøèáêà ïðèëîæåíèÿ 1: ' + err);
            return;
         }
          alert('смотрим 2: ' + groupTerms); // здесь опять видим правильно
          var retres = new String();
         obj.carsByGroup(groupTerms, retres);
// var res = obj.carsByGroup(groupTerms, retres);
         alert('смотрим 3: ' + retres); // а здесь видим "смотрим 3; " и далее пусто
      }
   }
}

При этом функция clientConnected срабатывает отлично и передает строку из dll-ки, а вторая функция carsByGroup не срабатывает

Вопрос: как правильно из JavaScript передать строку в DLL-ку и получить строку обратно? В смысле описания в IDL, в скрипте и в сишной функции?

спустя 1 день 14 часов [обр] Владимир Палант(434/4445)[досье]

! Ох уж эти "аналогичные проблемы", которые объявляются через четыре месяца...

Eugene[досье]
Не засоряйте чужую тему. На Xpoint принято: один вопрос — одна тема. Откройте свою тему. Но рекомендую сначала почитать Минимальный проблемный код

Powered by POEM™ Engine Copyright © 2002-2005