NPAPI插件 - 传递xulrunner组件的实例(nsCOMptr)

时间:2014-07-02 16:26:43

标签: c++ xul npapi xulrunner

搜索后我无法在这里找到解决方案,所以我不得不问!请原谅我的语言,因为我在NPAPI业务中很新。

我所拥有的是一个现有的插件,它从一个nsComponent( dataCreator )出来的本地运行的xulrunner应用程序中以大约100ms的周期接收数据。结果看起来相当不错,到目前为止xul应用程序是稳定的。但是,如果我增加数据的出现(我必须这样做),xul应用程序需要太长时间才能进行反应,这最终会导致xul崩溃。我认为XUL->插件I / O有点贵!?

到目前为止我学到的是插件能够创建组件的新实例:

    // inside myPlugin.cpp
    nsresult rv;
    nsCOMptr< myCompClass > _myComPtr ;
    _myComPtr = do_CreateInstance( "@myDomain.org/DIR/MYCOMPONENT;1", &rv ) ;

功能

    do_CreateInstance( ) ;

来自 nsComponentManagerUtlis.h ,它不属于xulrunner SDK,但它没有像

    do_giveMeTheRunningInstanceOf( "@myDomain.org/DIR/MYDATACREATOR;1", &rv ) ;

我现在的直觉是使用

    nsScriptablePeer::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result )  

将正在运行的 dataCreator nsCOMptr 传递到插件中的方法,可以直接进行通信并减少xul&lt; - &gt;插件I / O至少。 创建 dataCreator 的另一个实例绝对不是一个选项!

说实话:我不知道如何转换&#34; NPVariant(args [0])进入所需的nsCOMptr,对吗?或者是否有另一种可能在插件中接收指针?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我无法直接从npapi插件与xulrunner sdk进行交互,因为它们使用完全不同的API。 NPVariants无法传递xulrunner对象或其他本机指针类型。

这是一个完全的头脑风暴,我不知道它是否会起作用,但如果你能以某种方式将xulrunner扩展和npapi插件组合到同一个模块中,你可以使用全局地图和插件中的id来获得共享内存,但我不知道这是否可能。

你是正确的,与javascript的接口有成本;但实际上,这是个人通话成本最高的因为它们最终是跨进程的。通常,您可以通过使用更有效的呼叫来最小化此绝对不应该超过100毫秒。