このページはNetscapeNavigator
2.0以降及びMicrosoft Internet Exploler 3.0以降で正常に見られます。
Solly,Japanese only
Netscape プラグインの作成法(実習)
「概要」では、話が見えない方が多いと思います。ここでは、Windows95用の簡単なプラグインを作成します。ここで、動作の一形態について理解し、より複雑なプラグイン開発の弾みにしましょう。
それでは、私の作ったサンプルプラグイン「BBTIF」を、ここからダウンロードして下さい。
このプラグインは、TIFF形式及びBMP形式のファイルを表示する機能を持っています。その為に、ニュートン(株)のImageKit4という画像ライブラリを使用します。これを購入(定価:39,800円)するか、ニュートン(株)のホームページに体験版があるので、これをダウンロードして使用して下さい。プラグインを動作させるだけでしたら、BBTIF001.LZHに付属のDLLだけでOKです。
まずは、動かしてみましょう!
- ダウンロードしたBBTIF001.LZHを解凍して下さい。
すると、NPBTiffというディレクトリが作成されます。このサブディレクトリにDLLsがあります。
- DLLsの中の、NPBTiff.dllが「BBTIF」をコンパイルしたオブジェクトです。これを、Navigator内のprogram\pluginsにコピーして下さい。
- 残りのDLL(ImgKit4ライブラリ)を、\windows\systemにコピーして下さい。
- Sampleサブディレクトリ内にある、Sample.htmをNetscapeでロードして下さい。
TIFFイメージ(鳥)と、BMPイメージ(BBロゴ)が表示できたでしょうか?
それでは、このプラグインのソースについて説明していきます。
1.プロジェクトの作成
まず、Visual C++ ver5.0を使用して、プロジェクトを作成します。
- ファイル(F)→新規作成(N)から、「プロジェクト」の「Win32 Dynamic-Link Library」を指定して、「NPBTiff」を作成します。
※プロジェクトの名前は、「NP」ではじまり、トータル8文字以内に設定します。
2.プラグインSDKから、必要なファイルを集める
Netscape社のSDK(詳細は「概要」をご参照下さい)から、必要なヘッダファイルと、テンプレートを集めます。
以下のファイルを、プロジェクトのディレクトリにコピーします。
jri.h, jri_md.h, jritypes.h, npapi.h, npupp.h, Npwin.cpp
また、テンプレートファイルWintemp.cをリネームして、WinCallBack.cを作成します。
※名前は何でもかまいません。
これらのファイルをプロジェクトに追加します。
3.リソースファイルを作る
リソースファイル(NPBTiff.rc)を作成し、プロジェクトに追加します。
4.ImageKit4のAPIを実装する
ImageKit4(画像ライブラリ)のサンプルを参考に、APIをつくります(ImgKitApi.c,ImgKitApi.h)。Imgkdef.hとImagekit.hはサンプルをそのまま利用します。これらの説明については省略します。詳しくはソースファイルを参照して下さい。
BBTIFプラグインでは、以下の関数のみ使用します。
- LoadImgKitDll()・・・・・・・・・・DLLのロード
- UnLoadImgKitDll()・・・・・・・・DLLのアンロード
- ImgKitFileLoad()・・・・・・・・・ファイルからイメージをリード
- ImgKitMemFree()・・・・・・・・・・イメージの解放
- ImgKitDisplay()・・・・・・・・・・イメージ(画像)の描画
ImgKitApi.cをプロジェクトに追加して、全ての準備は整いました。あとは、WinCallBack.cを編集してプラグインを完成させるだけです。
5.プラグインを実装する
サンプルソースでは、コメントを和訳していますが、実質的に変更したのは以下の内容のみです。
- プライベートインスタンスを定義しているPluginInstance構造体に、ImageKit4のハンドルhImgKitを追加します
- NPP_Initializeに、以下の3行を追加します。
// ImageKitのロード
if(LoadImgKitDll()==FALSE)
return NPERR_GENERIC_ERROR;
- NPP_Shutdownに、以下の2行を追加します。
// ImageKitのアンロード
UnLoadImgKitDll();
- NPP_Destroyに以下の2行を追加します。
if (This->hImgKit != 0)
ImgKitMemFree(This->hImgKit);
- NPP_NewStreamに以下の2行を追加します。
// File Only Modeに設定する
*stype=NP_ASFILEONLY;
- NPP_StreamAsFileに以下の行を追加します。
// ImgKitによりファイルロード
if (This->hImgKit != 0)
ImgKitMemFree(This->hImgKit);
This->hImgKit = ImgKitFileLoad((char *)fname, "", "");
// 再描画
InvalidateRect( This->fhWnd, NULL, TRUE );
- ウィンドウプロシージャ(PlginWindowProc)を以下のように書き換えます。
PluginInstance* This = (PluginInstance*) GetProp(hWnd, gInstanceLookupString);
PAINT STRUCT ps;
switch( Msg ) {
case WM_PAINT: {
// 再描画
BeginPaint(hWnd, &ps);
if (This->hImgKit != 0)
ImgKitDisplay(hWnd, This->hImgKit, FALSE);
else{
TextOut(hWnd,0,0,"Cannot Open Error",17);
EndPaint(hWnd, &ps);
break;
}
default:
This->fDefaultWindowProc( hWnd, Msg, wParam, lParam);
}
return 0;
変更点はこれだけです。
あとはビルドすれば完成です。
6.動作の説明
このプラグインは、ファイルモードで作成しているため非常にシンプルになっています。ファイルモードは、NetscapeがURLからダウンロードしたデータをすべてローカル・キャッシュにダウンロードして、その後、
NPP_StreamAsFileを呼出し、キャッシュファイルへのパスをプラグインに渡します。
全体の流れは以下のようになります。
- プラグインがロードされると、まずNPP_Initializeが呼び出される。このとき、LoadImgKitDll()を呼び出してImageKit4ライブラリをロードする。
- つぎに、画像データに対応してインスタンスが作成され、NPP_Newが呼び出されます。ここでは、テンプレートの処理のみで、変更は行っていません。
- つづいて画像データ表す、ストリームが作成され、NPP_NewStreamが呼び出されます。このとき、ストリームの処理モードを設定できますので、ファイルモードにするため、スタイル(*stype)をNP_ASFILEONLYに設定します。
- ストリーム(画像データ)が全てローカルキャッシュに読み込まれると、NPP_StreamAsFileが呼び出されます。
ここで、ImageKit4のImgKitFileLoadを呼出し、画像データを画像ライブラリに読み込みます。
- この直後、NPP_DestroyStreamを呼出し、その後ストリームが破棄されます。このときは、テンプレートの処理のままで、変更は加えません。(ストリームが全てプラグインに送られると、Navigatorはストリームを破棄します。この為インスタンスのプライベートデータにストリームの内容をストックしておく必要があります)。
- ウィンドウイベントが発生すると随時、ウィンドウプロシージャ(PlginWindowProc)が呼び出されます。今回作成したプラグインでは、描画(WM_PAINT)のみハンドルし、ImgKitDisplayを使って再描画を行っています。
- ウィンドウをクローズするときには、NPP_Destroyが呼び出されます。このときに、ImageKit(画像ライブラリ)のメモリを解放し、画像データを破棄します。
- 最後にプラグインがアンロードされるときに、NPP_Shutdownが呼び出されます。このとき、UnLoadImgKitDll()をよびだして、ImageKit4をアンロードします。
7.終わりに
(半日で作った)簡単なプラグインを通じて、プラグインの基本について説明しました。私自身、いまのところ知識はこの程度しか持っていませんが、
あと印刷やメニューをサポートすることにより立派なプラグインになると思います。
尚IEは、ActiveXの仕様が一般的ですが、一応Netscape v.2のプラグインにも対応しています。
この為、今回作成したプラグインの場合、NPP_NewStreamで*stype=NP_ASFILEONLY;には対応していない(v.3機能のため)ので、
ここを、*stype=NP_ASFILE;にすれば、IE3でも動作するはずです(試してはいません)。
【改訂記録】
98/04/05版:公開
98/04/20版:
[ホームへ戻る]
Copyright (c) 1997-1999, BearBeetle, Allrights reserved.