如何使用第三方库来包含在 Firefox 插件/扩展中?

2024-01-24

我目前正在学习如何使用 XPCOM 创建 Firefox 插件,并且我想知道如何包含第三方库来开发它们。我遵循了一些教程从 C++ 文件编译 .xpt 和 .dll(在:https://developer.mozilla.org/en/How_to_build_a_binary_XPCOM_component_using_Visual_Studio https://developer.mozilla.org/en/How_to_build_a_binary_XPCOM_component_using_Visual_Studio and http://nerdlife.net/building-a-c-xpcom-component-in-windows/ http://nerdlife.net/building-a-c-xpcom-component-in-windows/)并且我不确定我们应该如何将这些文件包含到插件项目中(该项目被打包到 .xpi 文件中)。

我正在使用 Opencv (c++) 通过插件进行图像转换,例如将非常大的图像(3mb 高分辨率 png)调整为小而简单的图像(例如 600X800 200kb jpg),这将由我的插件完成。我知道Opencv是用c++编写的,xpcom可以将c++代码编译成dll和xpt。我读了几个教程,但大多数都指向在“C:/Program Files(x86)/Mozilla Firefox/components”中添加这些文件(xpt 和 dll),而不是在插件“components/”文件夹中(这不是如何添加的)我相信插件有效)。虽然 Mozilla 页面(上面列出)确实包含有关“{app}/components”和“{app}/application.ini”文件夹的内容,但我从未读过类似的内容,因此我很困惑这是如何完成的。

我的另一个选择是将 Opencv 方法制作成可执行文件,然后单独运行它(类似于 MemoryFox 插件如何运行可执行文件来清除 Firefox 的内存)并使用它来调整图像大小。

我真的不知道如何做到这一点(我是插件开发的新手),我想知道如何实现这一点(在插件中使用第 3 方 C++ 库)。一个示例、教程或解释就可以帮助我入门。

提前致谢。

编辑:我还想告知,我已经读过大部分内容https://developer.mozilla.org/en/Creating_XPCOM_Components https://developer.mozilla.org/en/Creating_XPCOM_Components(挑选并选择主题)并且它没有告诉我如何实现上述目标。


您可以在多个位置存储插件并通知 FireFox 它的存在。 大多数情况下,这取决于您想要如何分发它。

对于 MS Windows,loadLibrary 进程将搜索当前目录,然后搜索路径。 只需在插件的组件文件夹中将 xpcom.dll 与 3rdparty.dll 放在一起就可以了。

XPCOM 类似于 Windows COM,但跨平台。
您的设计是为了满足界面的要求。
您的插件可能不需要定义它自己的接口(.idl -compiles-> .xpt, .h),但如果它从 firefox 4 开始定义,您将需要在 chrome.manifest 中列出它。
编译完成后,您还需要在 chrome.manifest 中列出您的 dll。

以你的原型函数为例long Add(in long a, in long b);

baz_1.idl 可能看起来像

#include "nsISupports.idl" 
[scriptable, uuid(F0F0F0F0-AAAA-BBBB-CCCC-111111111111)]
interface iBaz : nsISupports
{ 
  long Add(in long a, in long b);
};

生成你的 header 和 xpi distrib

$(GECKOBIN_PATH)/xpidl -m header -I $(GECKOSDK_PATH)/idl -e baz_1.idl 
$(GECKOBIN_PATH)/xpidl -m typelib -I $(GECKOSDK_PATH)/idl -e baz_1.idl 

将合约指南链接到 FF4 的 C++ 合约名称

NS_DEFINE_NAMED_CID(BAZ_CID); // defined in baz.h generated from baz_1.idl
static const mozilla::Module::ContractIDEntry kSLMozContracts[] = {
    { "@foo.bar.com/baz;1", &kBAZ_CID },
    { NULL }
};

C++ 中的用法
nsCOMPtr<iBaz> baz = do_CreateInstance("@foo.bar.com/baz;1",&rv);

JavaScript 中的用法
var baz = components.classes["@foo.bar.com/baz"] .createInstance(Components.interfaces.iBaz);

Example.
我们的产品还提供 Firefox 插件,因此我们不提供 xpi,但插件位于产品的子文件夹中。

产品于
c:\program files\foo\

插件 - 让我们称之为 foobar
c:\program files\foo\bar

注册插件

HKLM\SOFTWARE\Mozilla\Firefox\Extensions\
"{GUID}"="c:\program files\foo\bar"

那么插件的布局是

foobar\chrome.manifest
foobar\install.rdf
foobar\components\baz_1.xpt
foobar\components\baz_1_32.dll
foobar\components\baz_1_64.dll
foobar\components\someOtherWorker.dll
foobar\chrome\ui.jar

在 FF

content baz jar:chrome/ui.jar!/content/baz/
skin baz classic/1.0 jar:chrome/ui.jar!/skin/classic/baz/ 

从 FF 4 开始,chrome 清单需要列出您的二进制文件,因此它看起来像 (FF 3.5之后我们只支持64位)

content baz jar:chrome/ui.jar!/content/baz/
skin baz classic/1.0 jar:chrome/ui.jar!/skin/classic/baz/ 

interfaces components/baz_1.xpt
binary-component components/baz_1_32.dll ABI=WINNT_x86-msvc
binary-component components/baz_1_64.dll ABI=WINNT_x86_64-msvc appversion>=3.5

FireFox 5(现已推出)已更改

  • xpt 文件的格式 - 因此 FF5 不会找到您的接口,除非您使用该 SDK 进行构建。
  • xpcom 注册的版本 - 因此 FF5 不会使用为 FF4 构建的 dll,因为 xpcom 版本不够高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用第三方库来包含在 Firefox 插件/扩展中? 的相关文章

随机推荐

  • C++ 模板函数参数推导和函数解析

    今天我只想提出一个关于C 模板函数参数推导和C 11中模板函数重载解析的问题 我使用的是vs2010 sp1 我定义了两个模板函数 如下所示 功能 1 template
  • 在 Angular 应用程序中处理过滤值的更优雅的方式

    我在 Angular 2 应用程序中多次重新加载表格显示中的数据时遇到了一些问题 我认为主要问题与以下事实有关 在初始组件加载时 我将数据作为网络请求发送给一系列过滤器 基本上 我们利用 Mongo Mongoose 功能 让我们在 pos
  • APN 重复令牌

    我们有一个推送通知服务器 它保存多个不同应用程序的数据 设备令牌 由于 Apple 希望阻止人们使用 UDID 作为标识符 我正在考虑更改此服务器 以便它不再依赖 UDID 来识别设备 据我所知 APN 返回的令牌不是全局唯一的 而是每个设
  • 我如何编写一个 mt4 指标,在前 6 小时的每小时蜡烛图上绘制矩形和水平线

    我是 mql4 编码的新手 我想知道如何根据下图编写一个执行以下操作的指标 在当天的小时图上绘制一个矩形 覆盖前 6 小时的最高和最低价格点 蜡烛 沿着找到的最高点和最低点画两条水平线 1 请注意 1 和 2 应严格基于每小时时间段 并且不
  • 如何在 Spring Data REST 中禁止 PUT 而允许 POST 和 PATCH?

    是否可以在 Spring Data REST 中完全禁止对存储库进行 PUT 同时仍然可以对集合进行 POST 并对项目进行 PATCH 这背后的基本原理是 PUT 通常允许替换语义 但在我们的例子中 资源只能通过集合上的 POST 创建
  • 您可以使用 TortoiseGit 与索引/暂存区域进行交互吗?

    我的任务是向我的同事做关于 Git 的演示 他们几乎都是习惯使用 TortoiseCVS 的 Windows 用户 我已经使用 Git 大约一年了 但我几乎只使用 Unix 命令行界面 所以我一直在尝试熟悉 Windows GUI Git
  • 如何解析 React Js 中的最小和最大日期输入?

    我创建了一个函数 该函数返回当前日期的减法或加法 并将结果设置为日期输入的最小值或最大值 我的职能 SubDate subDay gt let tgDate new Date tgDate setDate tgDate getDate su
  • 如何获取流星智能包中的当前目录

    我正在为要在 Atmosphere 上发布的流星构建一个包 我需要获取该包安装的当前目录 我努力了process cwd 在包中包含的文件中 但它获取我的应用程序的当前目录 该软件包已安装并正常工作 似乎该软件包与应用程序在同一进程中运行
  • Eclipse LogCat - 不工作

    这是有史以来最令人沮丧的事情 LogCat 不断停用 断开连接 运行 eclipse 后 LogCat 记录第一次运行 之后 它变为空白 我必须重新启动 Eclipse 才能使其再次运行 然后同样的事情再次发生 这有什么关系呢 它曾经工作得
  • 如何在 Sublime 中将“一行 html”格式化为漂亮的文档? [复制]

    这个问题在这里已经有答案了 我有一个 html 源文件 仅包含一行 如下所示 testwow 我想将其格式化如下 test wow 我使用了命令 编辑 gt 行 gt 重新缩进 但它不起作用 在 Sublime Text 中试试这个 突出显
  • 如何配置Automapper注入Ninject 2.0?

    Structure Map 和 Windsor 有配置示例 http www cprieto com index php 2009 08 20 using automapper with castle windsor http www cp
  • thread_guard 与scoped_thread

    在书里 Anthony Williams 的 C 并发实践 你可以找到以下两段代码 我做了一些细微的修改 片段 1 class thread guard std thread t public explicit thread guard s
  • 仅授予对 Amazon 别名密钥的访问权限的 IAM 策略

    In KMS http docs aws amazon com kms latest developerguide overview html有亚马逊别名键 例如 alias aws s3 and 客户主密钥 http docs aws a
  • 捕获音频会话事件

    我尝试编写一些应用程序来监视音频会话 如 SndVol 所做的那样 我激活了 IAudioSessionManager2 通过 IAudioSessionEnumerator 获取当前音频会话列表 使用音频会话管理器中的 RegisterS
  • 比较不同编码的字符串

    我只需要与 JavaScript 中的字符串进行比较 但有时特定字符串的比较会失败 通过 jQuery 获得一个值text 方法 来自一些自动生成的 HTML var value1 somelement text 另一个值被硬编码在 Jav
  • css/javascript 表单 onfocus 占位符文本仍然存在,输入时消失

    我只是想弄清楚如何制作像 www tumblr com 这样的表单 onFocus 占位符保留在输入框中 但当开始键入时 占位符文本消失 我通过找到的另一个教程知道如何进行 onFocushere http www webstuffshar
  • 我的 Android 应用程序在按主页按钮后崩溃

    我有一个具有滚动视图和媒体播放器的活动 当音乐正在播放并且我按主页时 它正常关闭 但是当我在没有音乐或其他任何内容的情况下按下主页按钮时 应用程序停止运行 请帮忙 有一个代码或有什么方法可以避免这个问题呢 我是安卓新手 这是我的日志猫 01
  • 朱莉娅:变量未定义

    变量作用域的行为看起来很奇怪 代码块 tp 1 function test2 println tp end 工作得很好 同时 function test if tp 0 tp tp 1 end end 给出异常 tp 未定义 怎么了 由于变
  • 带有 ACR122U 的 libnfc 对 SELECT(通过 AID)APDU 没有响应

    See NFC 读取器 SELECT 通过 AID APDU 未路由到 Android 设备 https stackoverflow com q 50316799 2425802关于调试和最终结果 TL DR 读者可能已经不复存在了 我有
  • 如何使用第三方库来包含在 Firefox 插件/扩展中?

    我目前正在学习如何使用 XPCOM 创建 Firefox 插件 并且我想知道如何包含第三方库来开发它们 我遵循了一些教程从 C 文件编译 xpt 和 dll 在 https developer mozilla org en How to b