从JavaScript无法访问XPCOM对象方法

问题描述:

我试图构建Firefox的扩展。此扩展使用XPCOM组件(C++ dll)。我正在编译这个DLL,编译是可以的。从JavaScript无法访问XPCOM对象方法

我也成功地建立了一个JS代码instanciates从XPCOM对象:

try { 
    greenfox; 
    return true; 
} catch(e) { 
    alert(e); 
    return false; 
} 

返回的对象是这一个:

QueryInterface 
    QueryInterface() 

__proto__ 
    [xpconnect wrapped native prototype] { QueryInterface=QueryInterface()} 

QueryInterface 
    QueryInterface() 

一切都很好,但我不能打电话这个函数应该在我的XPCOM组件中。

这里是我的IDL文件:

[scriptable, uuid(ec8030f7-c20a-464f-9b0e-13a3a9e97384)] 
interface nsISample : nsISupports 
{ 
    attribute string value; 
    void writeValue(in string aPrefix); 
    void poke(in string aValue); 

    void start(); 
    double stop(); 
}; 

当callingstart()函数,我得到的JavaScript错误: “是不是一个函数”

greenfox.start(); 

你有什么想法?似乎没有功能暴露在我的XPCOM中。

+0

如果你真的在这里写了你如何实例化你的XPCOM组件,它会有所帮助。 – 2012-01-31 06:41:56

你用你的uuid调用QueryInterface吗?在使用创建的组件实例之前,有必要调用它。您的用法与here中的内容相符吗?

如果你不想处理XPCOM,你可以使用js-ctypes

+0

-1在没有解释问题的情况下使用swearwords。总之这是“不是答案”的边界。 – 2012-01-31 06:39:13

+0

对不起,我认为找到正确的文档时遇到问题的人会阅读它,而不是我可能不充分的解释。 – artificialidiot 2012-01-31 10:47:23

您似乎在查看仅暴露nsISupports接口的对象。您的界面(nsISample)默认情况下不会公开,您必须明确请求它。您可以通过实例化你的组件是这样做的,例如:或者

var greenfox = Components.classes["..."].getService(Components.interfaces.nsISample); 
greenfox.start(); 

,您也可以拨打QueryInterface的对象上,你已经有了:

greenfox.QueryInterface(Components.interfaces.nsISample); 
greenfox.start(); 

一般情况下,我不建议使用二进制XPCOM组件出于原因概述here,维护它们需要付出太多努力。我宁愿建议编译一个正规的DLL并通过js-ctypes使用它。 Reference a binary-component to js-ctypes提到如何找到附加组件中的DLL以通过js-ctypes使用它。

+0

这是一个主角,我还在Mozilla给出的示例中找到了这个代码。我已经尝试过,但是当试图获取实例时,我收到以下消息:[Exception ...“无法转换JavaScript参数arg 0 [nsISupports.QueryInterface]”nsresult:“0x80570009(NS_ERROR_XPC_BAD_CONVERT_JS)”location:“JS frame :: chrome://greenfox/content/greenfox_sampler.js :: :: line 11“data:no] – frinux 2012-02-05 17:55:56

+0

我走得更远:我检查了Components.interfaces并没有找到nsISample。 – frinux 2012-02-05 18:08:57

+0

@frinux:这意味着您的界面的XPT文件没有注册。要么你没有将它包含在你的扩展中,或者[chrome.manifest'中的'interfaces'条目](https://developer.mozilla.org/en/Chrome_Registration#interfaces)不正确。 – 2012-02-05 18:39:12