ABC2プラグインのつくりかた

まずはヘッダファイルをダウンロードしてください。話はそれからです。

IABCInternal2.h

ABC2プラグインの仕組み

ABC2のプラグインは基本的に、ABC2が発生させるイベントをトラップするイベントハンドラとして動作します。
逆を言えば、ABC2がイベントを発生させない限りは、動くことが(ほぼ)できないということです。
また、イベントとして定義されていない動作についても、よほどの工夫をしない限り捕まえることは困難です。
そのかわり、ABC2の構造への依存度を減らすことで、ある程度互換性を確保し続けることが期待できます。

ABC2プラグインが呼び出されるプロセス

ABC2のプラグインは、ABC2が起動すると同時にロードされ、終了時にアンロード(開放)されます。
現時点(v2.1x)においては、起動中の動的なロード/アンロードはサポートされていません。

ABC2は、Windows DLLとしてプラグインをロードすると、プラグイン初期化関数「ABCPlugin_Initialize」がある
ことを確認し、プラグインを判別するためのハンドルと、自身の呼び出しインターフェース・オブジェクト
「IABCInternal2」へのポインタを引数として、この初期化関数を呼び出します。このオブジェクトは、
IUnknownから継承されるCOMオブジェクトです。

プラグインはこのオブジェクトを通して、ABC2本体へのイベントハンドラの登録や、ABC2本体内の機能
呼び出しを行います。

プラグインからイベントハンドラが登録されると、ABC2はイベントハンドラリストに、その情報を登録します。
そして、イベントが発生すると、登録されたハンドラを順番に呼び出します。

プラグインをアンロードする際は、まず開放準備関数「ABCPlugin_Uninitialize」を呼び出し、プラグインに
イベントの登録解除や、状態の保存などを促します。

ABC2プラグインを作る際の注意点

1.マルチスレッド

ABC2は、ダウンロードなどの処理については、マルチスレッドに対応しています。
このため、イベントの内容によっては、マルチスレッド対応であることが必須のものがあります。
たとえば、ダウンロードに関するイベント、ファイル保存に関するイベントなどは、ほぼそのすべてが
マルチスレッド対応のイベントです。
したがって、これらのイベントに登録されるイベントハンドラは、マルチスレッドで呼び出されることを
意識して設計されていなければなりません。
また、マルチスレッドには排他制御がつきものですが、安易に排他制御を増やすと、ダウンロード処理の
パフォーマンスが大きく損なわれます。

現在シングルスレッドなイベントについても、将来的にマルチスレッド化される可能性があることを考え、
イベントハンドラを登録する際に、そのハンドラがマルチスレッド対応かどうかを自己申告するようになっ
ています。
ABC2がイベントを呼び出す際は、マルチスレッド対応が必要かどうかを必ず通知しており、将来のバージョ
ンにおいて、スレッドモデルが一致しなくなったイベントについては、呼び出されないようになっています。

2.問い合わせ系イベント

ABC2のイベントの中には、たとえばグループ名やファイル名、あるいはフィルタリングなどについて、問い
合わせるものがあります。
これらのイベントにおいては、そのハンドラがABC2内で唯一であれば問題ありませんが、複数のプラグイン
から登録される可能性があることに注意が必要です。これはすなわち、あるハンドラが返した問い合わせ結
果が、必ずしも採用されないことを意味します。
たとえば、フィルタのイベントハンドラの場合、複数のフィルタで一致を見たとき、どのような処理を行う
かを、ユーザが選択できます。最初のフィルタがヒットした時点で処理を中止するようユーザが選択したと
きは、優先順位が低く設定されているフィルタには問い合わせが来ないことすらありうる、ということです。
また、あるハンドラが「フィルタ対象の記事である」とう結果を返しても、ほかのプラグインが「フィルタ
対象から除外する」という結果を返した場合には、どちらを採用するかはユーザの設定にゆだねられます。
つまり、ある記事をフィルタ対象と判定したとしても、その記事がフィルタ対象にされるとは限らず、それ
に依存した処理を依存したことはできない、ということです。

3.GUIの扱い

プラグインのGUIに関する実装は、もっとも注意が必要です。
これは、マルチスレッドとの兼ね合いでもありますが、プラグインからGUIを表示したりする場合は、基本的
にメニューやボタンなどのイベントに限るべきです。
まず、ABC2のGUIはマルチスレッドに対応しません。ABC2本体のGUI操作は、すべてABC2本体が動作するメイン
のスレッドのみから行えます。プラグインの場合は、「シングルスレッド専用」のイベントハンドラ内のみ、
ということになります。
唯一の例外は、ABC2のウィンドウ下部にあるログ表示です。
この部分については、プラグインから呼び出されるLogMessage関数内で自動的に排他制御がなされ、どのスレッ
ドからも自由に呼び出すことが可能です。(もちろん、排他制御があるということはパフォーマンスに影響します)

また、メニューなどからダイアログを表示する場合は、裏でABC2本体や別のプラグインが動いていることに注意
してください。もしかしたら、ダイアログを表示している最中に、ダウンロードが開始されるかもしれません。
もし、ダイアログ表示中にダウンロードが開始されて困る場合は、メニュー追加時のフラグに、選択時スタート
禁止のフラグを追加してください。