如何创建Thunderbird原生扩展?

时间:2016-12-14 09:04:36

标签: xpcom thunderbird

我需要为Thunderbird编写扩展程序。该扩展将用于进行一些文本挖掘并依赖于本机C ++代码。根据我的理解,Thunderbird扩展现在主要用JavaScript编写,而XPCOM正在慢慢弃用(https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM)。

此外,XPCOM似乎有点沉重,我想要一个更容易的途径来访问我的C ++代码。除了XPCOM之外还有其它方法可以从雷鸟扩展中访问C ++代码吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

看看js-ctypes(https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes

小例子:

Components.utils.import("resource://gre/modules/FileUtils.jsm");
Components.utils.import("resource://gre/modules/ctypes.jsm")

// path to C++ lib (/home/username/.thunderbird/PROFILE/extensions/EXTNAME/components/lib.so)
var libPath = FileUtils.getFile("ProfD", ["extensions", "EXTNAME", "components", "lib.so"]);

var lib = ctypes.open(libPath.path);
var libFunction = lib.declare("concatStrings", // function name in C++ code
                              ctypes.default_abi,
                              ctypes.char.ptr, // return value
                              ctypes.char.ptr, // param1
                              ctypes.char.ptr // param2
);
var ret = libFunction("abc", "efg");
lib.close()

另请注意,由于函数重载,C ++编译器会对名称进行重命名,因此您的函数名称可能是' concatStrings'在C ++代码中,但在汇编时它可能类似于' _123concatStrings'。为了防止这种情况,请声明您的功能:

extern "C" const char * concatStrings ( const char * str1, const char * str2 );