我正在尝试为 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/