将数组从NPAPI插件返回到javascript

时间:2012-08-22 17:17:51

标签: npapi

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

  1. 获取窗口的NPObject(听起来像你有这个)
  2. 创建一个新数组并获取该数组的NPObject
  3. 对要发送到DOM的每个项目的NPObject调用“推送”
  4. 保留数组的NPObject并将其返回到返回值NPVariant
  5. 我会抓住你用于这些的代码;可能会有一些小错误。

    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上调用“push”

    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

    祝你好运

相关问题