2010-09-14 51 views
1

我已經完成了我的NPAPI插件,它在谷歌瀏覽器中效果很好,但是有一個奇怪的問題。問題是我在插件中編寫了一個方法,該方法向瀏覽器返回一個字符串。爲此,您必須在瀏覽器中分配內存並將結果字符串複製到該內存中。例如:NPN_MemFree NPN_MemFree將返回的數據鎖定到谷歌瀏覽器

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。當我從谷歌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 2010-10-26 15:26:35