XPCOM对象方法无法从JavaScript访问
XPCOM object method is unaccessible from JavaScript
我正在尝试为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。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 访问类似C++的Javascript中的HttpStatusCode
- QtWebkit javascript bridge,无法访问 Qt 对象方法
- 在QWebview中使用javascript访问文件系统
- 在 javascript 中访问对象的成员C++而无需注册其成员
- 如何使用V8从C++访问和调用Javascript对象属性和方法
- XPCOM对象方法无法从JavaScript访问
- 使用QJSEngine从JavaScript访问Qt API
- JavaScript V8 回调中的访问'Arguments'
- 如何在CEF3中使用JavaScript访问C++中的动态字符串值
- 无法使用 QtWebkit 通过 javascript 访问 Qt 对象方法