搜索后我无法在这里找到解决方案,所以我不得不问!请原谅我的语言,因为我在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,对吗?或者是否有另一种可能在插件中接收指针?
感谢您的帮助
答案 0 :(得分:1)
我无法直接从npapi插件与xulrunner sdk进行交互,因为它们使用完全不同的API。 NPVariants无法传递xulrunner对象或其他本机指针类型。
这是一个完全的头脑风暴,我不知道它是否会起作用,但如果你能以某种方式将xulrunner扩展和npapi插件组合到同一个模块中,你可以使用全局地图和插件中的id来获得共享内存,但我不知道这是否可能。
你是正确的,与javascript的接口有成本;但实际上,这是个人通话成本最高的因为它们最终是跨进程的。通常,您可以通过使用更有效的呼叫来最小化此绝对不应该超过100毫秒。