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に初期化されることに注意してください。このメソッドをGoogleChromeから2回呼び出すと、問題が発生します。初めてそれはうまくいきます。2回目以降は、ブラウザに「X」と表示されたガベージ値を返します。Firefoxで同じプラグインをテストしましたが、メソッドを何度呼び出しても正常に動作し、正しい値を返します。しかし、プラグインをロードしたページを閉じると、Firefoxがクラッシュします。

この奇妙な状況で何が起こるかについてのポインタはありがたいです。私はそれに取り組んでおり、有用な情報に到達したらスレッドを更新します。

4

1 に答える 1

1

次の行を削除する必要があります。

if (m_pPtr) NPN_MemFree(m_pPtr);

文字列をスクリプトに返し、呼び出し元(この場合はブラウザのJavaScriptエンジン)が文字列を所有します。

これを解放すると、メモリがまだ使用されているか、ブラウザによってすでに再利用または解放されている可能性があるため、未定義の動作が発生します。

于 2010-09-21T22:43:49.693 に答える