2010-09-14 28 views
1

J'ai terminé mon plug-in NPAPI et cela fonctionne très bien dans Google Chrome, mais il y a un problème étrange. Le problème est que j'ai codé une méthode dans le plug-in qui renvoie une chaîne au navigateur. Pour ce faire, vous devez allouer une mémoire dans le navigateur et copier la chaîne résultante dans le navigateur. Quelque chose comme:NPN_MemAlloc après NPN_MemFree retourne les données de retour à Google Chrome

bool 
ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, 
           uint32_t argCount, NPVariant *result) 
{ 
    if (name == sMethod_id) { 
    ... 

    //free the memory if it is already allocated 
    if (m_pPtr) NPN_MemFree(m_pPtr); 

    //allocate the string in the browser memory 
    m_pPtr = (char*)NPN_MemAlloc(size+1); 
    SecureZeroMemory(m_pPtr, size+1); 
    memcpy(m_pATR, string, size); 

    //send result to browser 
    STRINGZ_TO_NPVARIANT(m_pPtr, *result); 

    return true; 
} 
    ... 

} 

Notez que « m_pPtr » est membre de données de la classe et est initialisé à NULL lors de la construction. Le problème se produit lorsque j'appelle cette méthode deux fois à partir de Google Chrome. La première fois ça fonctionne très bien. À partir de la deuxième fois, il renvoie une valeur de poubelle affichée «X» dans le navigateur. J'ai testé le même plug-in dans Firefox et cela fonctionne très bien et renvoie la valeur correcte, peu importe combien de fois j'appelle la méthode. Mais quand je ferme la page qui a chargé le plug-in, alors Firefox se bloque.

Tout pointeur sur ce qui se passe dans cette situation étrange est apprécié. Je travaille dessus et mettra à jour le fil une fois que j'aurai atteint des informations utiles.

Répondre

1

Vous devez supprimer la ligne suivante:

if (m_pPtr) NPN_MemFree(m_pPtr); 

Vous retournez la chaîne au script et l'appelant (dans ce cas, les navigateurs moteur JavaScript) est propriétaire.

Si vous le libérez, ceci conduit à undefined behaviour car la mémoire peut encore être utilisée ou déjà réutilisée ou libérée par le navigateur.

+0

C'est définitivement le problème. Pour plus d'informations, consultez la rubrique Gestion de la mémoire dans NPAPI: http://colonelpanic.net/2009/12/memory-management-in-npapi/ – taxilian