0

私は StackOverflow と QtWebkit の初心者でもあります。

NP_GetMimeTypeDescriptionMimetypeおよびMimetype descriptionNp_Initialiseなどの機能を持つ非常に基本的な Npapi プラグインを作成しました。application/basic-pluginapplication/basic-plugin:bsc:Plug-ins SDK sample

しかし、QtWebKit のデモブラウザと Mozilla Firefox にロードする際に問題に直面しています。生成された .so ファイルを、ブラウザーが/usr/lib/mozilla/plugins/Qt Lib パスなどのプラグインを見つけるパスに配置しました。

Mimetype を含む test.html ファイルがありますapplication/basic-plugin。Mozilla ブラウザーと QtWebKit Demo Browser の両方でこのプラグインを起動しようとしていますが、どちらの場合もプラグインが起動しません。

理由がわかりません。どんな提案も大歓迎です...

4

1 に答える 1

1

助けと提案をありがとう。
.so ファイルを正しいフォルダー /usr/lib/mozilla/plugins/ および Qt Lib パスに配置したにもかかわらず、プラグインが呼び出されない理由を突き止めることができました。

2つの理由がありました...

  1. コンパイル中にコンパイラ ディレクティブとして Define XP_UNIX (-DXP_UNIX) を有効にする必要がありました。これにより、関数のさまざまなプロトタイプと実装が考慮されます

    extern "C"
    NPError OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs
    #ifdef XP_UNIX
                              , NPPluginFuncs *pluginFuncs
    #endif
                              )
    {
            // keep a pointer to the browser functions
            g_browser = browserFuncs;
    
            // any memory that is to be shared by all instances of 
            the browser plugin should be initialized here.
            ;
    
    #ifdef XP_UNIX
           // under Linux, as the browser won't call NP_GetEntryPoints() 
            explicitly, do it now to fill in <pluginFuncs>
    
            return NP_GetEntryPoints(pluginFuncs);
    #else
    
            return NPERR_NO_ERROR;
    #endif
    }
    

    extern "C"
    #ifdef XP_UNIX
    NPError NP_GetValue(void* instance, NPPVariable variable, void *value)
    #else
    NPError NP_GetValue(NPP instance, NPPVariable variable, void *value)
    #endif

2.. NP_GetValue と NPP_GetValue の 2 つの関数がありました。

extern "C"
NPError NP_GetValue(void* instance, NPPVariable variable, void *value); 

NPError NPP_GetValue(NPP instance, NPPVariable variable, void *ret_value);

NPP_GetValue は、NP_GetEntryPoints で登録する必要があるプラグイン関数です。

    extern "C"
    NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* NPPluginFuncsptr)
    {
            ......
            NPPluginFuncsptr->newp = NPP_New;
            NPPluginFuncsptr->getvalue = NPP_GetValue;
            NPPluginFuncsptr->setvalue = NPP_SetValue;
            return NPERR_NO_ERROR;
    }

私のコードでは、NP_GetValue のみが実装され、NPP_GetValue は実装されていません。そのため、NPP_GetValue は .so で定義されておらず、そのため .so が読み込まれませんでした。

関数 NPP_GetValue を実装すると、この関数が定義され、.so ファイルにエクスポートされ、正常にロードできました。

ブラウザからプラグインへの関数の呼び出しシーケンスは次のとおりです...

  1. NP_Initialize -> ブラウザは最初に初期化関数を呼び出します。(Linux の場合、ブラウザーは GetEntryPoints を呼び出さないため、NP_GetEntryPoints を明示的に呼び出してプラグイン関数のセットをエクスポートする必要があります)

  2. NP_GetEntryPoints -> Linux の NP_Initialize から明示的に呼び出され、プラグイン関数を公開/エクスポートします。

  3. NP_GetValue 変数 : 1 -> プラグイン名を取得するためにブラウザから呼び出されます (NPPVpluginNameString)

  4. NP_GetValue 変数 : 2 -> プラグインの説明を取得するためにブラウザから呼び出されます (NPPVpluginDescriptionString)

  5. NP_GetMimeDescription -> MimeType の説明を取得するためにブラウザーから呼び出されます (この関数は Mime Type の説明を返す必要があります。例: return("application/basic-plugin:bsc:Plug-ins SDK sample");)

  6. NPP_New -> プラグイン インスタンスを作成するためにブラウザから呼び出されます。

  7. NPP_GetValue PLUGIN:main.cpp,NPP_GetValue,446ENTRY - > プラグイン固有のデータを取得するためにブラウザから呼び出されます...

  8. ……

上記のシーケンスの次の関数は IF と呼ばれ、前の関数呼び出しが成功を返した場合にのみ呼び出されることに注意してください。:-)

于 2012-07-18T06:25:10.213 に答える