我嘗試過一百萬種不同的東西,無法獲得此功能。我的Firefox擴展無法使用。什麼是使用C++ XPCOM組件的Firefox擴展(XPI文件)的結構?
裏面的XPI文件我有:
* content folder
-browserOverlay.js
-browserOverlay.xul
* locale folder
*en-US folder
-browserOverlay.dtd
-browserOverlay.properties
* skin folder
-browserOverlay.css
我有火狐14.0.1和我的「Hello World」的擴展,不使用XPCOM是工作的一部分。現在只需添加一個帶有按鈕的工具欄,點擊後顯示「Hello World」,然後嘗試運行我使用Gecko SDK構建並使用VS 2005編譯的C++ XPCOM組件。
browserOverlay .js文件包含以下代碼:
/**
* XULSchoolChrome namespace.
*/
if ("undefined" == typeof(XULSchoolChrome)) {
var XULSchoolChrome = {};
};
/**
* Controls the browser overlay for the Hello World extension.
*/
XULSchoolChrome.BrowserOverlay = {
/**
* Says 'Hello' to the user.
*/
sayHello : function(aEvent) {
let stringBundle = document.getElementById("xulschoolhello-string-bundle");
let message = stringBundle.getString("xulschoolhello.greeting.label");
window.alert(message);
try
{
// normally Firefox extensions implicitly have XPCOM privileges
//but since this is a file we have to request it.
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
const cid = "@example.com/XPCOMSample/MyComponent;1";
obj = Components.classes[cid].createInstance();
// bind the instance we just created to our interface
obj = obj.QueryInterface(Components.interfaces.IMyComponent);
} catch (err) {
alert(err);
return;
}
var res = obj.Add(3, 4);
alert('Performing 3+4. Returned ' + res + '.');
}
};
當我單擊按鈕時,我看到第一個警報窗口。當我單擊確定時,我看到一個窗口,顯示以下錯誤消息:
TypeError: Components.classes[cid] is undefined
我在做什麼錯?我應該放置.dll文件的xpi文件的位置在哪裏? .idl文件? .xpt文件?
迄今爲止您的回答非常有幫助,但是我仍然缺少一件事:鑑於最新的Gecko SDK不包含xpidl二進制文件,我如何編譯IDL文件?你知道我在哪裏可以找到當前的教程嗎? – 2012-08-09 16:57:46
@JohnSmith:正如'xpidl'文檔中提到的,你應該使用['pyxpidl'](https://developer.mozilla.org/en-US/docs/XPIDL/pyxpidl)。 – 2012-08-09 18:04:11