0

以前はプラグイン全体が、多くのグローバル変数と静的変数を使用した非常に単純な実装として機能していましたが、現在はオブジェクト ベースの設計に変換しているため、複数のインスタンスを安全にインスタンス化できます。

ただし、プラグインのインスタンスを作成すると、MyScriptableNPObject::NewObject() メソッドまで到達し、そこで createobject() を呼び出そうとしますが、返されず、ブラウザーがクラッシュします。

ScriptableNPObject* ScriptableNPObject::NewObject(NPP npp) 
{
 _DebugLog("ScriptableNPObject::NewObject");

 ScriptableNPObject* newObj =  (MyScriptableNPObject*)npnfuncs->createobject(npp, &_npclass);

 _DebugLog("ScriptableNPObject::NewObject - end");

    return newObj;
}

これをデバッグする簡単な方法としていくつかの基本的なログがそこにあり、このメソッドが予想どおり getValue() から呼び出されていることがわかりますが、最終ログは決して出力されないため、createobject( )。

NPObject に対して独自の Allocate() メソッドを定義しましたが、NPClass は、私が知る限り正しく定義されているようです。これらは次のとおりです。

NPObject* ScriptableNPObject::_Allocate(NPP npp, NPClass *aClass) 
{     
    return (NPObject *)new ScriptableNPObject(npp);
}


NPClass ScriptableNPObject::_npclass = {
    NP_CLASS_STRUCT_VERSION,
    ScriptableNPObject::_Allocate,
    ScriptableNPObject::_Deallocate,
 NULL,
    ScriptableNPObject::_HasMethod,
    ScriptableNPObject::_Invoke,
    ScriptableNPObject::_InvokeDefault,
    ScriptableNPObject::_HasProperty,
    ScriptableNPObject::_GetProperty,
    NULL,
    NULL,
    NULL,
 ScriptableNPObject::_Construct,
};

npnfuncs 構造体も有効です。だから私は何がうまくいかないのか少し困惑しています!

どんな助けでも大歓迎です、

ありがとう。

4

1 に答える 1

2

デバッガーで npnfuncs ポインターを確認します。問題があるに違いない。

それがなければ、mozilla のソースを入手してデバッグ バージョンをビルドし、コードをステップ実行してクラッシュしている場所を正確に確認できるようにします。これは、あなたが説明したようなポインターの問題を追跡する最も簡単な方法です。

しかし、真剣に、私は Georg が言ったことを支持します (確かに私は偏見がありますが): FireBreath をチェックしてください。これにより、多くのトラブルシューティングが節約されるだけでなく、必要に応じて IE への移植が容易になります。

于 2010-08-03T16:32:32.223 に答える