【问题标题】:How to create a Thunderbird native extension?如何创建 Thunderbird 原生扩展?
【发布时间】:2017-04-29 13:03:33
【问题描述】:

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

此外,XPCOM 似乎有点重,我想要一个更简单的途径来访问我的 C++ 代码。除了 XPCOM 之外,还有其他替代方法可以从 Thunderbird 扩展访问 C++ 代码吗?

谢谢!

【问题讨论】:

    标签: xpcom thunderbird


    【解决方案1】:

    看看 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++ 编译器确实会进行名称修改,因此您的函数名称在 C++ 代码中可能是“concatStrings”,但在汇编中它可能类似于“_123concatStrings”。为了防止这种情况,请声明您的函数,例如:

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

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多