你已经很近了;你只需要填写一些细节。FireBreath代码库有执行此操作的示例,但实际实现有点抽象。我没有执行此操作的任何原始 NPAPI 代码;我在 FireBreath 中构建插件,在那里它几乎非常简单。不过,我可以告诉你你需要做什么。
如果你把它分解成几个步骤,问题就会变得更简单:
- 获取窗口的 NPObject(听起来像你有这个)
- 创建一个新数组并获取该数组的 NPObject
- 为要发送到 DOM 的每个项目调用该 NPObject 上的“推送”
- 保留数组的 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 。
祝你好运