NPVariant -js傳遞給NPAPI插件參數在firefox和chrome需要採用不同的獲取方式

原帖地址:http://blog.sina.com.cn/s/blog_4c6631790102wd1o.html

整數參數

typedef struct _NPVariant {
    NPVariantType type;
    union {
        bool boolValue;
        int32_t intValue;
        double doubleValue;
        NPString stringValue;
        NPObject *objectValue;
    } value;
} NPVariant;

firefox會將js傳過來的參數存放在NPVariant結構體的intValue中,而chrome則是存放在NPVariant結構體的doubleValue中。

綜合解決方法:

int numberValue(const NPVariant &v)
{
    switch( v.type ) {
        case NPVariantType_Int32:
            return NPVARIANT_TO_INT32(v);
        case NPVariantType_Double:
            return(int)NPVARIANT_TO_DOUBLE(v);
        default:
            return 0;
    }
}

字符串參數

  1. 問題分析

    先來看一下幾個NP結構體的定義:

typedef struct _NPVariant {
    NPVariantType type;
    union {
        bool boolValue;
        int32_t intValue;
        double doubleValue;
        NPString stringValue;
        NPObject *objectValue;
    } value;
} NPVariant;

typedef struct _NPString {
    const NPUTF8 *UTF8Characters;
    uint32_t UTF8Length;
} NPString;
  1. 當參數是字符串類型時,我們獲取傳入參數const NPVariant* args時,在firefox下可以直接獲取args->stringValue.UTF8Characters的值,即是js傳給插件的字符串,但是在chrome下,直接獲取args->stringValue.UTF8Characters時,後面會出現亂碼,主要原因是該字符串是UTF8編碼的。

  2. 解決方法

    對字符串進行轉換:

char* stringValue(const
NPVariant &v){

NPUTF8 *val = static_cast(BrowserFuncs->memalloc((NPVARIANT_TO_STRING(v).UTF8Length + 1) * sizeof(*val)));
if (val)
{
strncpy(val, NPVARIANT_TO_STRING(v).UTF8Characters, NPVARIANT_TO_STRING(v).UTF8Length);
val[NPVARIANT_TO_STRING(v).UTF8Length] = '\0';
}
return val;
}

調用該函數後得到的就是正確的字符串,例如:char *value = stringValue(args[0]);

注意:用完之後要釋放BrowserFuncs->memfree(value);

原帖地址:http://blog.sina.com.cn/s/blog_4c6631790102wd1o.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章