我已经完成了我的NPAPI插件,它在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崩溃了。
任何关于在这种奇怪的情况下会发生什么的建议都是值得感谢的。我正在处理它,一旦我找到任何有用的信息,我就会更新这个帖子。
发布于 2010-09-22 06:43:50
您需要删除以下行:
if (m_pPtr) NPN_MemFree(m_pPtr);您将字符串返回给脚本,调用者(在本例中是浏览器的JavaScript引擎)拥有它。
如果您释放它,这将导致undefined behaviour,因为内存可能仍在使用中,或者已经被浏览器重用或释放。
https://stackoverflow.com/questions/3707288
复制相似问题