npapi之从 NPAPI 插件返回数组到 javascript

myhome 阅读:24 2024-11-01 17:39:52 评论:0

我想将字符串数组从 NPAPI 插件返回到 Javascript。目前我只使用普通的 NPAPI。我已阅读以下链接:

我能够将 alert() 从插件返回到 javascript,并且我可以获得 NPNVWindowObject,但我现在无法弄清楚如何将元素推送到数组并将其返回到 javascript。

工作代码示例将不胜感激,谢谢

请您参考如下方法:

你已经很接近了;你只需要填写一些细节。 FireBreath代码库有 examples of doing this ,但实际实现有点抽象。我没有执行此操作的任何原始 NPAPI 代码;我在 FireBreath 中构建插件,它在那里几乎简单得可笑。不过,我可以告诉您需要做什么。

如果将问题分解为几个步骤,问题会变得更简单:

  1. 获取窗口的 NPObject(听起来你有这个)
  2. 创建一个新数组并获取该数组的 NPObject
  3. 为要发送到 DOM 的每个项目在该 NPObject 上调用“推送”
  4. 为数组保留NPObject,在返回值NPVariant中返回

我会尝试一下您将用于这些的代码;可能会有一些小错误。

1) 获取窗口的 NPObject

// Get window object. 
NPObject* window = NULL; 
NPN_GetValue(npp_, NPNVWindowNPObject, &window); 
// Remember that when we're done we need to NPN_ReleaseObject the window! 

2) 创建一个新数组并获取该数组的 NPObject

基本上我们通过调用 window.Array() 来完成此操作,您可以通过在窗口上调用 Array 来完成。

// Get the array object 
NPObject* array = NULL; 
NPVariant arrayVar; 
NPN_Invoke(_npp, window, NPN_GetStringIdentifier("Array"), NULL, 0, &arrayVar); 
array = arrayVar.value.objectValue; 
// Note that we don't release the arrayVar because we'll be holding onto the pointer and returning it later 

3) 为要发送到 DOM 的每个项目在该 NPObject 上调用“推送”

NPIdentifier pushId = NPN_GetStringIdentifier("push"); 
for (std::vector<std::string>::iterator it = stringList.begin(); it != stringList.end(); ++it) { 
    NPVariant argToPush; 
    NPVariant res; 
    STRINGN_TO_NPVARIANT(it->c_str(), it->size(), argToPush); 
    NPN_Invoke(_npp, array, pushId, &argToPush, 1, &res); 
    // Discard the result 
    NPN_ReleaseVariantValue(&res); 
} 

4)为数组保留NPObject,在返回值NPVariant中返回

// Actually we don't need to retain the NPObject; we just won't release it. Same thing. 
OBJECT_TO_NPVARIANT(array, *retVal); 
// We're assuming that the NPVariant* param passed into this function is called retVal 

这应该差不多了。确保您了解内存管理的工作原理;阅读 http://npapi.com/memory如果你还没有。

祝你好运


标签:JavaScript
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号