c++ - JavaScript 无法访问 XPCOM 对象方法

标签 c++ firefox firefox-addon xpcom

我正在尝试为 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();
};

调用 start() 函数时,出现 Javascript 错误:“不是函数”

greenfox.start();

你有什么想法吗?在我的 XPCOM 中似乎没有公开任何功能。

最佳答案

您似乎正在查看一个仅公开nsISupports 接口(interface)的对象。默认情况下,您的接口(interface) (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 使用它。

关于c++ - JavaScript 无法访问 XPCOM 对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9070233/

相关文章:

javascript - Tab ReadyState 在第一个服务器响应之前返回 'complete'

c++ - 为什么返回的对象是右值?

javascript - 在数组中缓存函数

javascript - Firefox sdk - 内容脚本无法访问 self.port

javascript - 为什么我的 Firefox 插件无法执行请求

javascript - TypeError document.querySelector(...) 为空

c++ - 重构具有不同参数的独特函数

c++ - 在C++中将带小数位的数字从char转换为int

c++ - Visual Studio 2013编程 "<<"是不是匹配操作数?

firefox - Firefox扩展和Firefox插件之间有什么区别?