Firefoxプラグイン開発(6)——FFプラグインの基礎知識


前の文章はnpruntimeの例プログラムを勉強しました.次は待ちきれないほど自分のプラグインを実現したいです.VS 2005を使ってやることにしました.
npgnetというプロジェクトを新築しました.npruntimeの例によって、np_を新設しました.ntry.cpp,npn_gate.cpp、npp_gate.cpp、npgnet.defの4つのファイルを作成し、CGnetFFPluginを新規作成し、例のキーコードを追加しました.コンパイル後、生成されたnpgnet.dllをFFのpluginsディレクトリに置いて、アドレスバーにabout:pluginsを入力します.私は頼りにしています.私のプラグインがありません.どういうことですか?三つの導出関数は標準通りに書きました.ファイルを比較しましたが、私の工程は追加されていません.rcとreource.hはこの原因かもしれません.
VS 2005に戻り、資源パネルにVERIONリソース項目を追加し、ProductNameなどのリソース項目を修正した後、npruntime例と比較してみました.まだMIMETypeが足りません.このドンドンはとても重要です.これはFFプラグインの身分証です.FFはこのドンドンであなたのプラグインをマッチングして識別します.しかし、VS 2005にどのようにVERIONのキーを追加するかは分かりませんので、私はEditPlusでnpgnet.rcを開けます.手動でMIMETypeを追加しました.OKです.今.rcとreource.hは全部ヨーロッパになりました.またコンパイルして、生成したnpgnet.dllをFFのpluginsディレクトリの下に置いて、アドレスバーにabout:pluginsを入力します.私はやはり私のプラグインがありません.分かりにくいですね
頭が大きいです.これから一連のコード比較とテストを行いました.何回も失敗しました.ここでは省略します.最後に原因を発見しました.これはrcの上にあります.私のこれ.rcはVS 2005でメニューコマンドを使って追加しました.標準言語は簡体字中国語です.npruntimeの例は英語です.ファイル比較ツールで比較してみました.codepageと部分コードの位置は違います.実はnpruntimeのこれ.rcファイルを私のこれに替えて、そして出力のdllをコンパイルして、FFは識別することができます!いったい何の原因ですか?rcは私のものです.何か足りないものがありますか?それともFFは英語しか認識できません.rc?先にそんなに多く研究するつもりはありません.少なくとも私のプラグインの肝心な点はこの上にありません.FFに認識してもらえたらいいです.
プラグインを書くと決めた以上は、まずプラグインの概念を理解してください.このページに詳しい紹介があります.https://developer.mozilla.org/en/Gecko_プラグイン.API_Reference/Plug-i_ミュージック
下の文字は私のいくつかの読書ノートと体験です.
一、プラグインのロードプロセス
一つのページが開くと、このページにプラグインが組み込まれている場合、ブラウザは次のようなことをします.
  • MIMETypeによりマッチングプラグイン
  • があるか確認する.
  • プラグインコードをメモリ
  • にロードする.
  • 初期化プラグイン
  • 新しいプラグインのインスタンス
  • を作成します.
    プラグインは、1つのページに複数のオブジェクトを例示しても良いし、同じ時間に別のウィンドウに実装しても良い.ページを閉じると、プラグインのインスタンスが破棄されます.最後のインスタンスが削除されると、プラグインコードはメモリからアンマウントされます.
    以下はプラグイン内の関数呼び出しプロセスです.
  • プラグインが初めてメモリに読み込まれると、ブラウザがプラグインのNP(u)を起動します.Initializeメソッドです.便宜上、すべてのプラグイン定義関数は「NPP」で始まり、すべてのブラウザ定義関数は「NPN」で始まります.
  • ブラウザがプラグインのインスタンスを作成すると、NPP_を呼び出します.Newメソッド
  • プラグインのインスタンスが削除されると(ページを閉じる、ウィンドウを閉じるなど)、NPP_が起動されます.デストロイメソッド
  • 最後のインスタンスが削除され、メモリからプラグインがアンインストールされると、NP(u)が起動されます.Shutdownメソッドです
  • 二、プラグイン検出
    Javascriptを使ってプラグインがインストールされているかどうかを検出できます.以下はテストコードです.    var mimetype=navigator.mimeType[appication/mozila-npgnet-scriptable-plugin]    if(mimetype)    {        var plugin=mimetype.enabledPlugin;        if(plugin)        {            document.writeln(「Plugin had been installed and be enabeled.」)        }    }    else    {        document.writeln(「Sorry,Plugin has NOT been installed.」)    }}
    ここを見て、この検出はとても役に立つと思います.ユーザーがまだインストールされていないことを検出すると、どこでインストール(綺麗なページに転向する)をダウンロードするかをユーザに指示します.インストールされていることを検出すると、プラグインコードを動的にロードします.いいです.
    三、プラグインの構造概要
    プラグインの方法は、プラグイン方法(Plug-in Methods)とブラウザ方法(Browser Methods)に分けられます.プラグイン方法は、プラグイン内で自分で実行する方法です.NPPをプレフィックスとして命名します.ブラウザ方法は、Geckoが実行する方法で、NPNをプレフィックスとして命名します.データ構造(Data Structures)NPで開始します.プラグインはウィンドウがあるかないかに分けられますが、記事ではウィンドウがある場合には、より安定して制御しやすいということを勧めています.また、ページの一部としてプラグインを使用することができ、HTMLコードを使用してプラグインの表示を制御することができます.
    2つの方法でプラグインが見えなくなります.
    1、embedタグを使うと、そのhidden属性が使えます.例えば、〈embed src=「audiplay.aiff」type=「audio/x-aiff」hidden=「true」
    2、もしあなたがobjectタグを使うなら、hidden属性がないので、CSSで隠しを完成できます.
    object
    {
        visibility:visible;
    )
    object.hiddenObject
    {
        visibility:hidden!impotant;
        width:0 px  !impotant;
        height:0 px  !impotant;
        magin:0 px  !impotant;
        padding:0 px  !impotant;
        border-style:none  !impotant;
        border-width:0 px  !impotant;
        max-width:0 px  !impotant;
        max-height:0 px  !impotant;
    )
    <object data=「audiplay.aiff」type=「audio/x-aiff」class=「hiddenObject」
    次の文では、Objectというラベルの使用を紹介し、ActiveXとプラグインがどのように一体となって使用されるかを説明する例をあげました.
    一番後ろの部分は、objectとembedの両方のラベルの様々な属性についての説明と例です.
    ちなみに、objectとembedの両方のタグは、ページにプラグインを埋め込むことができます.どうやって取捨選択しますか?文章の中にはこんな話があります.
    Though the object element isthe preferred way to invokepluinininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininininin79142 element.
    Objectは推奨されている起動プラグインであるにもかかわらず、embedはプラグイン(Netscape 4.x以上のブラウザ)に組み込むことができるという意味です.しかし、ユーザーがプラグインをインストールしていない時に、彼にインストールを促すなら、FFの標準プラグインシステムはあなたがembedタグを使う時だけ、自動的にこのようなヒントをユーザに提供する効果を完成させることができます.
    私が見た後の感じは、objectはembedより複雑なようです.少なくともFFというブラウザに対してはこうです.彼はHTML W 3 Cの標準ですが、多くの場合はembedを使えばいいです.しかも今はNetscape 4 x以下のブラウザを使っています.そうですか?
    OKです.この数日間の勉強を通して、やっとFFのプラグインの作成に初歩的な感性を覚えました.今までのところは順調です.