XPCOM对象方法无法从JavaScript访问

XPCOM object method is unaccessible from JavaScript

本文关键字:JavaScript 访问 对象 方法 XPCOM      更新时间:2023-10-16

我正在尝试为Firefox构建一个扩展。此扩展使用XPCOM组件(C++dll)。我正在编译DLL,编译可以。

我还成功地构建了一个JS代码,从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();
};

当调用()函数时,我得到了Javascript错误:"不是函数"

greenfox.start();

你知道吗?我的XPCOM中似乎没有公开任何函数。

您看到的对象似乎只显示了nsISupports接口。默认情况下,你的接口(nsISample)不会被公开,你必须明确地请求它

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

或者,您也可以对已有的对象调用QueryInterface

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

一般来说,我不建议使用二进制XPCOM组件,原因如下,维护它们需要付出太多的努力。我建议编译一个常规的DLL,并通过js-cypes使用它。将二进制组件引用到js ctypes提到了如何在插件中定位DLL以通过js ctype使用它。

是否使用uuid调用QueryInterface?在使用创建的组件实例之前,有必要调用它。你的用法和这里的一致吗?

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