2013-07-25 3 views
0

Я пытаюсь получить элементы dom с помощью тэга, используя npapi с хром, но длина результата всегда равна нулю.NPN_Invoke getElementsByTagName Not Work

NPVariant tagName; 
    STRINGZ_TO_NPVARIANT("input", tagName); 
    NPVariant inputCollection; 
    if(!NPN_Invoke(m_pNPInstance, doc,NPN_GetStringIdentifier("getElementsByTagName"), &tagName, 1, &inputCollection)) 
    { 
     outLog<<"get input error"<<endl; 
    } 
    NPVariant npvlength; 
    if (NPN_GetProperty(m_pNPInstance, NPVARIANT_TO_OBJECT(inputCollection), NPN_GetStringIdentifier("length"), &npvlength)) 
    { 
     outLog<<npvlength.type<<"," <<npvlength.value.intValue<<endl; 
    } 

npvlength.value.intValue всегда 0, но когда я пытаюсь получить элемент, это нормально. Я могу получить элемент и его свойство.

 NPVariant index; 
     INT32_TO_NPVARIANT(0, index); 

     NPVariant Item; 
     if (NPN_Invoke(m_pNPInstance, NPVARIANT_TO_OBJECT(inputCollection), NPN_GetStringIdentifier("item"), &index, 1, &Item)) 
     { 
      NPVariant typeVal; 
       if (NPN_GetProperty(m_pNPInstance, NPVARIANT_TO_OBJECT(Item), NPN_GetStringIdentifier("type"), &typeVal)) 
       { 
        outLog<<NPVARIANT_TO_STRING(typeVal).UTF8Characters<<endl; 
       } 
     } 

ответ

1

Вы уверены, что это на самом деле NPVariantType_Int32 и не NPVariantType_Double?

Особенно кросс-браузерный вы не должны полагаться на то, чтобы быть тем или иным (это не определено, какой из них фактически используется для значений number). Вместо этого используйте хелпер для конверсий, например .:

bool convertToInt(const NPVariant& v, int32_t& out) { 
    if (NPVARIANT_IS_INT32(v)) { 
    out = NPVARIANT_TO_INT32(v); 
    return true; 
    } 

    if (NPVARIANT_IS_DOUBLE(v)) { 
    out = NPVARIANT_TO_DOUBLE(v); 
    return true; 
    } 

    // not a numeric variant 
    return false; 
} 
+0

Большое спасибо! – tosneytao