我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
My Firefox extension is not working. What's the structure of a Firefox extension (XPI file) that uses C++ XPCOM components?
我已经尝试了一百万个不同的东西,但无法让它工作。
在 xpi 文件中,我有:
* content folder
-browserOverlay.js
-browserOverlay.xul
* locale folder
*en-US folder
-browserOverlay.dtd
-browserOverlay.properties
* skin folder
-browserOverlay.css
我有Firefox 14.0.1,我的"Hello World"扩展中不使用XPCOM的部分正在工作。现在,它所做的只是添加一个带有按钮的工具栏,单击该按钮时显示"Hello World",然后尝试运行我使用Gecko SDK构建并使用VS 2005编译的C++XPCOM组件。
浏览器覆盖.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] 未定义
我做错了什么?我应该在 xpi 文件中的什么位置放置.dll文件?.idl 文件?.xpt 文件?
我猜你正在遵循一个过时的教程,大多数教程还没有更新到 Gecko 2.0 中的 XPCOM 更改。但对于您的问题:
我应该在 xpi 文件中的什么位置放置.dll文件?
随心所欲。传统放置位于 components/
子目录中。
.idl 文件?
它不应该是扩展的一部分,而应该是.xpt
文件的一部分。
.xpt 文件?
再次出现在您喜欢的任何位置,但通常与.dll
文件位于同一目录中。
但是,将必要的声明添加到chrome.manifest
文件中非常重要,通常是这样的:
interfaces components/mycomponent.xpt
binary-component components/mycomponent.dll ABI=WINNT_x86-msvc
另请参阅有关组件代码中需要更改的内容的文档(如果您愿意,Firefox 源代码树中有一个示例)。请注意,您必须使用与要使用组件的 Firefox 版本匹配的 Gecko SDK 版本编译组件。所以对于Firefox 14,你需要使用Gecko SDK 14。由于不再有任何二进制兼容性,因此您的组件将只能在Firefox 14中工作,而不能在Firefox 13或Firefox 15中工作。
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- 嵌套参数包扩展失败
- C4204:使用的非标准扩展:非常量聚合初始值设定项
- [temp.variadic]中关于包扩展实例化的措辞
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?