【问题标题】:npapi webkit Plugin array processingnpapi webkit 插件数组处理
【发布时间】:2012-07-30 10:28:28
【问题描述】:

我想处理来自 java 脚本的数组。 (即,从 html 页面到插件代码。我想将值从 html 代码获取到插件中的变量,以便我可以在代码中修改它们并为其他目的进行处理。)。

但是我在这方面遇到了问题。我知道内部数组将作为 NPObject 处理。我正在尝试从此 NPObject 检索数组的长度和数组的元素,但即使数组的长度不是零,返回的数组长度也为零。

欢迎提出任何建议......

我有一个包含数组的 html 页面 HTML页面如下:

<html>
<script type="text/javascript">
var arrayData = [9,1,2,3,4,5,6,7,8,9];
function handleEvent(e) {
    if (e.keyCode == 55) {
        document.getElementById('arrayint_ele_disp').innerHTML = arrayData;
        process_intarray(arrayData);
    }
}
function  process_intarray(arrayData){
    obj = document.getElementById("Obj");
    if(obj){
        obj.process_array_intval(arrayData); 
    }
}
</script>

<body onload="init()" onkeydown="handleEvent(event)">
<div id ="arrayint_ele_disp" style="position:absolute;left:100px;top:250px"> 
ARRAY_INT VAL </div>
</body>

</html>

我处理数组元素的插件代码如下:

bool ScriptableObject::process_intarray(const NPVariant* args, uint32_t 
     argCount, NPVariant* result)
{

    //Get the Length of the array
    //NPObject *inobject = args[0].value.objectValue;
    NPObject *inobject = args->value.objectValue;

    bool bRetval = false;
    NPVariant npvlength;
    //NPIdentifier id;

    bRetval = 
   NPN_GetProperty(m_npp,inobject,NPN_GetStringIdentifier("length"),&npvlength);
    printf("\n NPN_GetProperty length type %d value : %d\n"
  ,npvlength.type,npvlength.value.intValue);

    //Get the array elements
    int i = 0;
    for(i = 0; i < npvlength.value.intValue; i++)
    {
        NPVariant CurVal;
        NPN_GetProperty(m_npp,inobject,NPN_GetIntIdentifier(i),&CurVal);
        m_prop_array_intval[i] = CurVal.value.intValue;
    }
    return true;

}

在这个函数中 NPN_GetProperty(m_npp,inobject,NPN_GetStringIdentifier("length"),&npvlength);正在返回一个真实的。

但是在检查 npvlength 的长度时,它给出 0 并且它的类型为 NPVariantType_Double。 我无法理解为什么..

欢迎提出任何建议...

【问题讨论】:

    标签: javascript webkit npapi qtwebkit browser-plugin


    【解决方案1】:

    您不应该依赖Int32Double 之一的数字。如果数字类型是双重使用 value.doubleValue 来获取长度,否则你会得到意想不到的值(由于 valueunion,因此 doubleValueintValue 引用相同的内存)。
    理想情况下,为转换编写自己的辅助函数,这样您就不必担心无处不在的特定 NPVariantType

    您还应该缓存NPIdentifiers:在最坏的情况下,NPN_Get*Identifier() 可能会导致从插件进程到浏览器进程并返回的完整进程间往返,除了字符串比较/散列/ ...

    【讨论】:

    • 嗨乔治,感谢您的建议...我也尝试了 npvlength.value.doubleValue 但它仍然为零。并且数组元素是整数,所以我使用的是 npvlength.value.intValue...任何其他建议...
    • @user1523492:可以肯定的是,您是否还调整了您的printf() 语句以使用%f 而不是%d
    • @user1523492:很高兴听到这个消息。顺便说一句,如果一个答案解决了你的问题,你can accept it
    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多