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

C++ 有人如何使用第三方库来包含在Firefox插件/扩展中?,c++,opencv,firefox-addon,xpcom,C++,Opencv,Firefox Addon,Xpcom,我目前正在学习如何使用XPCOM创建Firefox插件,我想知道如何包含第三方库来开发它们。我遵循了一些教程来编译C++文件中的XPT和.DLL(注意:和),我不确定我们如何将这些文件包含到一个ADDO项目中(它被打包成.XPI文件)。 我正在使用Opencv(c++)通过插件进行图像转换,例如将非常大的图像(3mb高分辨率png)大小调整为小而简单的大小(例如600X800 200kb jpg),这将由我的插件完成。我知道Opencv是用C++编写的,XPCcom可以将C++代码编译成DLL和

我目前正在学习如何使用XPCOM创建Firefox插件,我想知道如何包含第三方库来开发它们。我遵循了一些教程来编译C++文件中的XPT和.DLL(注意:和),我不确定我们如何将这些文件包含到一个ADDO项目中(它被打包成.XPI文件)。 我正在使用Opencv(c++)通过插件进行图像转换,例如将非常大的图像(3mb高分辨率png)大小调整为小而简单的大小(例如600X800 200kb jpg),这将由我的插件完成。我知道Opencv是用C++编写的,XPCcom可以将C++代码编译成DLL和XPT。我读了一些教程,但其中大多数都指向在“C:/ProgramFiles(x86)/Mozilla Firefox/components”文件夹中添加这些文件(xpt和dll),而不是在“components/”文件夹中添加插件(我相信这不是插件的工作方式)。虽然Mozilla页面(上面列出)确实包含了一些关于“{app}/components”和“{app}/application.ini”文件夹的内容,但我从未读过类似的内容,因此我对如何实现这一点感到困惑

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

我真的不知道如何做这个(我是新的AdDon开发),我想知道如何实现这一点(使用第三方C++ + LIBS到插件)。一个例子、教程或解释可以让我开始学习

提前谢谢


编辑:我还想告诉大家,我已经阅读了大部分(挑选和选择的主题),但它并没有告诉我如何实现上述目标。

有几个地方可以存储插件并通知FireFox它的存在。 主要取决于你想如何分配它

使用MS Windows,loadLibrary进程将搜索当前目录,然后搜索路径。 只需在插件的components文件夹中找到xpcom.dll和3rdparty.dll就可以了

XPCOM与windows COM类似,但可跨平台使用。
您的设计必须满足接口的要求。
您的插件可能不需要定义自己的接口(.idl-compiles->.xpt.h),但如果它是从Firefox4定义的,您需要在chrome.manifest中列出它。
编译后,您还需要在chrome.manifest中列出dll

以原型函数为例
long Add(在长a中,在长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);
};
生成您的头文件和xpi发行版

$(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 

将合同GUID与C++中的合同名链接为FF4

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 baz=do_CreateInstance(@foo.bar.com/baz;1“,&rv)

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

示例。
我们有一款产品也提供了firefox插件,因此我们不提供xpi,但该插件位于该产品的子文件夹中

产品在
c:\ProgramFiles\foo\

插件-让我们称之为foobar
c:\ProgramFiles\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<4中,您不需要在清单中列出二进制文件,组件文件夹中的内容会被加载并检查函数,以查看它们是否为xpcom,因此chrome清单可能看起来像

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位)

Firefox5(现已推出)已发生变化

  • xpt文件的格式-因此FF5不会找到您的接口,除非您使用该SDK构建
  • xpcom注册的版本-因此FF5不会使用为FF4构建的dll,因为xpcom版本不够高

您所指的教程是关于开发应用程序,而不是扩展的。因此application.ini不适用于您的情况。扩展有一个名为
chrome.manifest
的清单文件,从Firefox4开始,所有XPCOM组件和XPT文件都需要在那里注册,否则将被忽略。组件的位置不再重要,尽管
components/
仍然是它们的常见位置。应该是一个很好的起点-这应该解释你需要写什么


请注意,您正在阅读的教程中的源代码也已过时。当前代码示例链接到。您应该使用XULRunnerSDK2.0(对应于Firefox4)或更高版本。很抱歉,您来得不是时候-这是XPCOM在过去10年中最大的变化。

谢谢!!所以,使用我上面列出的教程,他们会自动将dll编译为64位吗?我还想知道如何通过JavaScript(从编译的dll)调用函数。接口:长添加(长a中,长b中);没有自动编译到64位。目前还没有windows支持的64位XulRunner SDK,您需要自己构建它。建议的网站,以帮助这是。据我所知,在64位操作系统上安装的FF大多数仍然是32位的。谢谢!!你如何调用C++中的函数?它是否与JavaScript函数相同?完成XPCOM组件后,您可以像使用JavaScript XPCOM组件一样使用它-获取组件实例并调用其上的方法。感谢您的帮助。现在我开始为FF4编译,但我无法使实例正常工作<代码>var instance=Components.classes['@example.com/MyComponent;1'].createInstance();var obj=instance.QueryInterface(Components.interfaces.IMyComponent)在此之后,它向我抛出一个错误:“无法转换JavaScript参数arg 0[nsISupports.QueryInterface]”nsresult:“0x80570009(NS\u error\u XPC\u BAD\u convert\u JS)”。如何修复此问题?@user654628:
Components.interfaces.IMyCompon
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