NPAPIを使用してブラウザープラグインを作成する

NPAPIは、Firefox、Chrome、Safari、Opera用のプラグインを作成できるAPIのセットです。 この記事では、NPAPIベースのプラグインの作成に関する初期情報を提供します。 Windows用のプラグインの例を示しますが、MacおよびUnixの開発者にとっては、この記事が役立ちます。 NPAPIを使用してプラグインを作成する一般的なアプローチについて説明します。



NPAPIプラグインは、ブラウザに「しがみつく」モジュールであり、特定のコンテンツタイプ (たとえば、 application / x-shockwave-flash )の処理を担当します。



NPAPIがどのように表示され、どのように変更されたかについては、 Wikipediaのページで読むことができます。

APIの詳細な説明は、 Gecko_Plugin_API_Referenceページで入手できます。



まず、プラグインの作成に必要なヘッダーファイルを含むXULRunnerをダウンロードする必要があります( include \ plugin )。 Visual Studioで作業している場合は、VC ++ディレクトリ内のインクルードファイルへのパスを追加することを忘れないでください( メニュー項目[ツール]-> [オプション]-> [プロジェクトとソリューション]-> [VC ++ディレクトリ] )。



プラグインは、次の機能をエクスポートするモジュールです。



NP_GetEntryPoints-プラグインのロード時に呼び出されます。 この関数を使用すると、ブラウザはプラグインに含まれる他の関数へのポインタを受け取ります。これはブラウザがプラグインと連携するために必要です。

NP_Initialize-プラグインが初期化されるときに呼び出されます。 呼び出されると、ブラウザは、プラグインが必要とする可能性のある機能へのポインタを渡します。

NP_Shutdown-プラグインの終了時に呼び出されます。



NP_GetEntryPointsNP_Initializeが呼び出される順序は 、ブラウザーによって異なる場合があります。 特に、Chromeは最初にNP_GetEntryPointsを呼び出し、次にNP_Initializeを呼び出します。



これらの機能をさらに詳しく見てみましょう。



NP_GetEntryPoints



プロトタイプ:



NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pFuncs)







NPPluginFuncs構造体へのポインターが引数として渡されます



typedef struct _NPPluginFuncs {

//

uint16_t size;

//

uint16_t version;

//

NPP_NewProcPtr newp;

//

NPP_DestroyProcPtr destroy;

// ,

// ( , ) ,

// , .


NPP_SetWindowProcPtr setwindow;

// .

NPP_NewStreamProcPtr newstream;

// .

NPP_DestroyStreamProcPtr destroystream;

// ,

// .


NPP_StreamAsFileProcPtr asfile;

// ,

// .


NPP_WriteReadyProcPtr writeready;

// .

NPP_WriteProcPtr write;

// ,

// .


NPP_PrintProcPtr print;

// .

NPP_HandleEventProcPtr event;

// URL .

NPP_URLNotifyProcPtr urlnotify;

// , .

void* javaClass;

// .

NPP_GetValueProcPtr getvalue;

// .

NPP_SetValueProcPtr setvalue;

} NPPluginFuncs;







サイズ( uint16_t size )およびバージョン( uint16_t version )に加えて、構造には、プラグインによって実装される関数へのポインターが含まれます。 少し先を見ると、 NPP_はプラグインによって実装される関数のプレフィックスであり、 NPN_で始まる関数が表示されます。これらの関数はブラウザによって実装されます。 些細なことのようですが、この知識はプラグインのライフサイクルをよりよく理解するのに役立ちます。



上記の関数のすべてがプラグインで使用できるわけではありません。未使用の関数にNULL関数を割り当てることが正しいかどうかについての情報はどこにも見つかりませんでした。そこで、何もせず、NPERR_NO_ERROR呼び出しの成功を示す値のみを返すスタブ関数を作成しました。 NPP_DestroyStreamProcPtrの例:



static NPError StubDestroyStream(NPP instance, NPStream *stream, NPReason reason)

{

return NPERR_NO_ERROR;

}







NP_Initialize



Windowsのプロトタイプ:



NPError WINAPI NP_Initialize(NPNetscapeFuncs *aNPNFuncs)







Unixのプロトタイプ:



NPError NP_Initialize(NPNetscapeFuncs *aNPNFuncs, NPPluginFuncs *aNPPFuncs)







プラグインが初期化されるときに呼び出されます。 この関数は、プラグインの最初のインスタンスを作成する前に、ブラウザーによって1回だけ呼び出される必要があります。



NPNetscapeFuncs構造体へのポインターが引数として渡されます



typedef struct _NPNetscapeFuncs {

//

uint16_t size;

//

uint16_t version;

// GET

NPN_GetURLProcPtr geturl;

// POST

NPN_PostURLProcPtr posturl;

//

NPN_RequestReadProcPtr requestread;

//

NPN_NewStreamProcPtr newstream;

//

NPN_WriteProcPtr write;

//

NPN_DestroyStreamProcPtr destroystream;

//

NPN_StatusProcPtr status;

// "user agent"

NPN_UserAgentProcPtr uagent;

//

NPN_MemAllocProcPtr memalloc;

//

NPN_MemFreeProcPtr memfree;

//

NPN_MemFlushProcPtr memflush;

//

NPN_ReloadPluginsProcPtr reloadplugins;

NPN_GetJavaEnvProcPtr getJavaEnv;

NPN_GetJavaPeerProcPtr getJavaPeer;

// GET

NPN_GetURLNotifyProcPtr geturlnotify;

// POST

NPN_PostURLNotifyProcPtr posturlnotify;

//

NPN_GetValueProcPtr getvalue;

//

NPN_SetValueProcPtr setvalue;

//

NPN_InvalidateRectProcPtr invalidaterect;

//

NPN_InvalidateRegionProcPtr invalidateregion;

// ,

NPN_ForceRedrawProcPtr forceredraw;

//

NPN_GetStringIdentifierProcPtr getstringidentifier;

//

NPN_GetStringIdentifiersProcPtr getstringidentifiers;

//

NPN_GetIntIdentifierProcPtr getintidentifier;

//

NPN_IdentifierIsStringProcPtr identifierisstring;

//

NPN_UTF8FromIdentifierProcPtr utf8fromidentifier;

//

NPN_IntFromIdentifierProcPtr intfromidentifier;

//

NPN_CreateObjectProcPtr createobject;

//

NPN_RetainObjectProcPtr retainobject;

//

NPN_ReleaseObjectProcPtr releaseobject;

//

NPN_InvokeProcPtr invoke;

//

NPN_InvokeDefaultProcPtr invokeDefault;

//

NPN_EvaluateProcPtr evaluate;

//

NPN_GetPropertyProcPtr getproperty;

//

NPN_SetPropertyProcPtr setproperty;

//

NPN_RemovePropertyProcPtr removeproperty;

//

NPN_HasPropertyProcPtr hasproperty;

//

NPN_HasMethodProcPtr hasmethod;

// , NPVariant

NPN_ReleaseVariantValueProcPtr releasevariantvalue;

//

NPN_SetExceptionProcPtr setexception;

NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate;

NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate;

//

NPN_EnumerateProcPtr enumerate;

//

NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall;

//

NPN_ConstructProcPtr construct;

NPN_GetValueForURLPtr getvalueforurl;

NPN_SetValueForURLPtr setvalueforurl;

NPN_GetAuthenticationInfoPtr getauthenticationinfo;

} NPNetscapeFuncs;







NP_Shutdown



Windowsのプロトタイプ:



void WINAPI NP_Shutdown(void);







Unixのプロトタイプ:



void NP_Shutdown(void);







プラグインがアンロードされるときに呼び出されます。 この関数では、プラグインは割り当てられたメモリを解放し、作成されたオブジェクトを破棄する必要があります。 この関数は、プラグインのすべてのインスタンスが削除された後、最後に呼び出されます。



プラグインを作成するには、DLLを作成し、リストされたエクスポート関数を実装する必要があり、実験を開始できます。 1つの重要な注意-プラグインによって処理されるコンテンツタイプを定義するMIMEType文字列がバージョン情報にない場合、プラグインはブラウザによってロードされませ 。 リソースファイルでは、次のようになります。



VALUE "MIMEType", "application/minimize-to-tray-extension"







この行がないと、Chromeはプラグインをダウンロードしたくなく、長い間、他のエクスポートされた関数は言うまでもなく、DllMainが呼び出されなかった理由を理解できませんでした。



プラグインに必要なすべての機能を実装する手間を省くために、Google Chromeの拡張プロジェクトのソースを開始点としてトレイに最小化できます。



All Articles