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.
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