2010-09-14 1 views
1

Я закончил свой подключаемый модуль NPAPI, и он отлично работает в Google Chrome, но есть странная проблема. Проблема в том, что я закодировал метод в подключаемом модуле, который возвращает строку в браузер. Для этого вам необходимо выделить память в браузере и скопировать в нее результирующую строку. Что-то вроде:NPN_MemAlloc после NPN_MemFree заставляет возвращать данные в 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; 
} 
    ... 

} 

Обратите внимание, что «m_pPtr» является членом данных класса и инициализируется NULL при строительстве. Проблема возникает, когда я дважды вызываю этот метод из Google Chrome. В первый раз он отлично работает. Со второго раза и так далее, он возвращает значение мусора, отображаемое «X» в браузере. Я тестировал один и тот же плагин в Firefox, и он отлично работает и возвращает правильное значение независимо от того, сколько раз я вызываю метод. Но когда я закрываю страницу, загружающую подключаемый модуль, происходит сбой Firefox.

Оценены любые указатели на то, что происходит в этой странной ситуации. Я работаю над этим и обновляю поток, как только получаю полезную информацию.

ответ

1

Вы должны удалить следующую строку:

if (m_pPtr) NPN_MemFree(m_pPtr); 

Вы возвращаете строку сценария и вызывающей (в этом случае браузер JavaScript двигатель) является его владельцем.

Если вы освободите его, это приведет к undefined behaviour, поскольку память все еще может быть использована или уже повторно использована или освобождена браузером.

+0

Это определенно проблема. Для получения дополнительной информации прочитайте «Управление памятью» в NPAPI: http://colonelpanic.net/2009/12/memory-management-in-npapi/ – taxilian