Компонент PyXPCOM не загружается в XULRunner - PullRequest
1 голос
/ 28 июля 2011

Я планирую создать приложение на основе XULRunner, которое должно взаимодействовать с Python. План состоит в том, чтобы использовать PyXPCOM. В настоящее время я учу себя использованию PyXPCOM и изучаю примерный компонент developmentmnet в Создание компонента Python XPCOM , но не могу заставить его работать.

Я использую Ubuntu 11.04, и мои шаги были:

  1. Создал каталог приложения и скопировал в него мой двоичный дистрибутив XULRUnner 5.x в подкаталог xulrunner

  2. Успешно построенный PyXPCOM после Сборка PyXPCOM

  3. Следовал инструкциям по установке в исходном файле README.txt PyXPCOM, скопировал все содержимое каталога obj/dist/bin в мой подкаталог xulrunner и добавил следующую строку в файл xulrunner/chrome.manifest:

    manifest components/pyxpcom.manifest
    
  4. Создал файл nsIPySimple.idl и поместил его в мое приложение components Подкаталог:

    #include "nsISupports.idl"
    [scriptable, uuid(2b324e9d-a322-44a7-bd6e-0d8c83d94883)]
    interface nsIPySimple : nsISupports {
        attribute string yourName;
        void write( );
        void change(in string aValue);
    };
    
  5. Создал файл xpt, выполнив следующую команду в моем подкаталоге components:

    [xul-sdk-path]/xpidl -m typelib -w -v -I [xul-sdk-path]/idl/ nsIPySimple.idl
    
  6. Создано nsIPySimple.py в моем components подкаталоге

    from xpcom import components, verbose
    
    class PySimple: #PythonTestComponent
        _com_interfaces_ = components.interfaces.nsIPySimple
        _reg_clsid_ = "{607ebc50-b8ba-11e0-81d9-001cc4c794e3}"
        _reg_contractid_ = "@mozilla.org/PySimple;1"
    
        def __init__(self):
            self.yourName = "a default name" # or mName ?
    
        def __del__(self):
            if verbose:
                print "PySimple: __del__ method called - object is destructing"
    
        def write(self):
            print self.yourName
    
        def change(self, newName):
            self.yourName = newName
    
    PYXPCOM_CLASSES = [
        PySimple,
    ]
    
  7. Зарегистрировал код Python, добавив следующие строки в мой chrome.manifest файл:

    interfaces  components/nsIPySimple.xpt
    component   {607ebc50-b8ba-11e0-81d9-001cc4c794e3} components/nsIPySimple.py
    contract    @mozilla.org/PySimple;1 {607ebc50-b8ba-11e0-81d9-001cc4c794e3}
    
  8. Создана функция Javascript для вызова метода Python:

    function showMore() {
        try {
            testComp = Components.classes["@mozilla.org/PySimple;1"].name;
            alert(testComp);
            testComp = Components.classes["@mozilla.org/PySimple;1"].
                           createInstance(Components.interfaces.nsIPySimple);
    
            testComp.write();
        }
        catch (anError) {
            alert(anError);
        }
    }
    

Но код Javascript выдает следующее исключение:

[Exception... "Component returned failure code: 0x80570015 
(NS_ERROR_XPC_CI_RETURNED_FAILURE) [nsIJSCID.createInstance]"  
nsresult: "0x80570015 (NS_ERROR_XPC_CI_RETURNED_FAILURE)"  
location: "JS frame :: chrome://reader/content/main.js :: 
showMore :: line 5"  data: no]

Есть идеи, что случилось или что я сделал не так?

Спасибо за помощь и разъяснения!

1 Ответ

1 голос
/ 10 августа 2011

Сообщение об ошибке указывает, что createInstance() вызов привел к ошибке. Хорошая новость: это означает, что все, что предшествовало createInstance(), успешно (PyXPCOM работает, и компонент был загружен / зарегистрирован правильно). http://code.google.com/p/pythonext/source/browse/samples/pyshell/components/pyShell.py указывает, что _com_interfaces_ должен быть списком, так что, возможно, в этом проблема. Если поддерживаемые интерфейсы не указаны правильно, то имеет смысл, что создание экземпляра завершится неудачей.

...