PyXPCOM组件未在XULRunner中加载

时间:2011-07-28 02:48:33

标签: python firefox xpcom xulrunner pyxpcom

我打算创建需要与Python接口的基于XULRunner的应用程序。计划是使用PyXPCOM。目前我正在自学使用PyXPCOM并在Creating a Python XPCOM component中浏览示例组件developmnet,但无法使其工作。

我正在使用Ubuntu 11.04,我的步骤是:

  1. 创建了一个应用程序目录,并将我的XULRUnner 5.x二进制分发版复制到xulrunner子目录

  2. Building PyXPCOM

  3. 之后成功构建了PyXPCOM
  4. 遵循PyXPCOM源README.txt文件中的安装说明,并将目录obj/dist/bin的全部内容复制到我的xulrunner子目录中,并在{{{{}}中添加以下行1}}文件:

    xulrunner/chrome.manifest
  5. 创建了manifest components/pyxpcom.manifest 文件并将其放在我的应用程序nsIPySimple.idl子目录中:

    components
  6. 通过在我的#include "nsISupports.idl" [scriptable, uuid(2b324e9d-a322-44a7-bd6e-0d8c83d94883)] interface nsIPySimple : nsISupports { attribute string yourName; void write( ); void change(in string aValue); }; 子目录中执行以下命令来创建xpt文件:

    components
  7. 在我的[xul-sdk-path]/xpidl -m typelib -w -v -I [xul-sdk-path]/idl/ nsIPySimple.idl 子目录

    中创建了nsIPySimple.py
    components
  8. 通过在我的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, ] 文件中添加以下行来注册python代码:

    chrome.manifest
  9. 创建了Javascript函数来调用Python方法:

    interfaces  components/nsIPySimple.xpt
    component   {607ebc50-b8ba-11e0-81d9-001cc4c794e3} components/nsIPySimple.py
    contract    @mozilla.org/PySimple;1 {607ebc50-b8ba-11e0-81d9-001cc4c794e3}
    
  10. 但Javascript代码抛出以下异常:

    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);
        }
    }
    

    知道发生了什么或我做错了什么?

    感谢您的帮助和澄清!

1 个答案:

答案 0 :(得分:1)

错误消息表明createInstance()调用导致错误。好消息:这意味着createInstance()之前的所有内容都成功了(PyXPCOM正在运行,组件已正确加载/注册)。 http://code.google.com/p/pythonext/source/browse/samples/pyshell/components/pyShell.py表示_com_interfaces_需要是一个列表,所以这可能是问题所在。如果未正确指定支持的接口,则创建实例失败是有意义的。