您可以在多个位置存储插件并通知 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 版本不够高。