1

我已经完成了我的 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 崩溃了。

任何指向在这种奇怪情况下发生的事情的指针都值得赞赏。我正在处理它,一旦我得到任何有用的信息,我会更新这个线程。

4

1 回答 1

1

您需要删除以下行:

if (m_pPtr) NPN_MemFree(m_pPtr);

您将字符串返回给脚本,调用者(在本例中为浏览器 JavaScript 引擎)拥有它。

如果你释放它,这会导致未定义的行为,因为内存可能仍在使用中,或者已经被浏览器重新使用或释放​​。

于 2010-09-21T22:43:49.693 回答