我已经完成了我的 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 崩溃了。
任何指向在这种奇怪情况下发生的事情的指针都值得赞赏。我正在处理它,一旦我得到任何有用的信息,我会更新这个线程。