我正在构建一个简单的 XPCOM 组件。但是每次我试图调用这个 xpcom 组件的方法时,firefox 都会崩溃。
文件层次结构如下:
HelloXpcom.xpi
---chrome.manifest
---install.rdf
---chrome
------content
---------sample.xul
---components
------HelloXpcom.dll
------nsISample.xpt
chrome.manifest 片段
content sample chrome/content/
interfaces components/nsISample.xpt
binary-component components/HelloXpcom.dll
overlay chrome://browser/content/browser.xul chrome://sample/content/sample.xul
我的界面空闲:
#include "nsISupports.idl"
[scriptable, uuid(F7F48977-382E-461B-B04A-44567EE6D45A)]
interface nsISample : nsISupports
{
attribute string value;
void writeValue(in string aPrefix);
void poke(in string aValue);
};
使用 xpidl.exe 生成 npISample.h 和 npISample.xpt。而所有的实现方法几乎什么都没有,只是做一些简单的事情。
样本.xul
<?xml version="1.0"?>
<overlay id="sample"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<statusbar id="status-bar">
<script>
function DoXPCOM()
{
try {
alert("1");
var sample = Components.classes["@baofeng/sample;1"].createInstance();
alert("2");
sample = sample.QueryInterface(Components.interfaces.nsISample);
alert("3");
dump("sample = " + sample + "\n");
}
catch(err) {
alert(err);
return;
}
var res = sample.SetValue("123");
var str = "";
obj.GetValue(str);
alert(str);
}
</script>
<button label="xpcom" oncommand="DoXPCOM();"/>
</statusbar>
</overlay>
"alert("1");"
"Components.classes["@baofeng/sample;1"].createInstance();"
被执行,它在联系人 ID "@baofeng/sample;1"
被 Firefox 识别 时崩溃 ,如果没有,应该有一些信息,如"@baofeng/sample;1"
undefined 弹出。所以 createInstance() 方法是重点。
有人可以帮我解决这个问题吗?