从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中。
-1在没有解释问题的情况下使用swearwords。总之这是“不是答案”的边界。 – 2012-01-31 06:39:13
对不起,我认为找到正确的文档时遇到问题的人会阅读它,而不是我可能不充分的解释。 – 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使用它。
这是一个主角,我还在Mozilla给出的示例中找到了这个代码。我已经尝试过,但是当试图获取实例时,我收到以下消息:[Exception ...“无法转换JavaScript参数arg 0 [nsISupports.QueryInterface]”nsresult:“0x80570009(NS_ERROR_XPC_BAD_CONVERT_JS)”location:“JS frame :: chrome://greenfox/content/greenfox_sampler.js ::
我走得更远:我检查了Components.interfaces并没有找到nsISample。 – frinux 2012-02-05 18:08:57
@frinux:这意味着您的界面的XPT文件没有注册。要么你没有将它包含在你的扩展中,或者[chrome.manifest'中的'interfaces'条目](https://developer.mozilla.org/en/Chrome_Registration#interfaces)不正确。 – 2012-02-05 18:39:12
如果你真的在这里写了你如何实例化你的XPCOM组件,它会有所帮助。 – 2012-01-31 06:41:56