TDatulaPlugin 0.02

 TDatulaPluginクラスは、Datula 1.51.08.01現在のPlugin API仕様に基づいてDelphi 5でプラグインを簡単に作れるようにするための簡易ラッパーです。

2001-2-24 戀塚

目次

  1. 収録内容
  2. 準備
  3. 派生すべき各メソッドの内容
  4. Datula API
  5. 注意事項
  6. サンプルのビルド
  7. 修正履歴

収録内容


準備

Delphi5で新規作成 - ダイナミックリンクライブラリ をします。

プロジェクトに追加で、本パッケージの DatulaApi.pasと DatulaPlugin.pasを追加します。

次に、新規作成 - ユニット で、メインユニットを作りましょう。

メインユニットでは、InterfaceUses DatulaPlugin; を追加し、TDatulaPluginを派生してプラグイン実装クラスを作成してください。また必ずunit初期化コードとしてそのユニットファイルの末尾に

Bbegin
  PluginMain := あなたの作ったクラス名.Create;
End. 

を追加してください(このことから分かるように、ひとつのDLLに記述できるプラグインは一個だけです)。


派生すべき各メソッドの内容

 TDatulaPluginの宣言は以下のようになっています。以下の注意に従って派生してください。

  TDatulaPlugin = class
private
FTitle: string;
FAuthor: string;
FVersion: string;
FVersionNum: cardinal;
public
constructor Create( title, author, version: string; versionnum: cardinal );
function InitSuccess: boolean; virtual;
function CanExit: boolean; virtual;
procedure OnUpdateView; virtual;
procedure OnActivate(hWnd: THandle; nState: Cardinal; bMinimized: boolean); virtual;
procedure OnNewPostmanInstance(hWnd: THandle); virtual;
procedure OnDeletePostmanInstance(hWnd: THandle); virtual;
end;

constructor Create( title, author, version: string; versionnum: cardinal );

 派生したコンストラクタから、必ず inherited Create(.....)として呼び出してください。

title, author, version は、Datulaの プラグイン - 一覧 で表示される文字列になります。

versionnum は、$01000000 が 1.0.0.0 になるような数値として与えます。

function InitSuccess: boolean;

 コンストラクタで初期化に成功したかどうかを得るために呼ばれます。

 派生しなければ、常に true (=成功) が返されます。

 ここでfalseを返すと、初期化に失敗したとしてプラグインが無効になります。

function CanExit: boolean;

 プラグインをアンロードしてよいかどうかを問合せるために呼ばれます。

 派生しなければ、常に true (アンロードしてよい) が返されます。

 ここで falseを返すと、アンロードを中止することができます。何らかの作業中のときなどに falseを返すようにしましょう。

procedure OnUpdateView;

 ビューアペインの内容が更新されるときに呼び出されます。

 本文やヘッダの内容に応じた処理をしたいときは、ここで記述しましょう。

 DatulaApiユニットにある GetHeaderText と GetBodyText を使えば、新しいヘッダとボディの生データが string で得られます。

 なお、メッセージが更新されるときは従来のメッセージ表示が終了した通知としてか、まず空のメッセージとして OnUpdateView が呼ばれた後、次に新しいメッセージとして OnUpdateViewが呼ばれるようです。

 派生しなければ何もしません。

procedure OnActivate(hWnd: THandle; nState: Cardinal; bMinimized: boolean);

 本体やPostmanがアクティブになったり非アクティブになった場合などに呼び出されます。

 nState には、以下のいずれかが渡されます。

 bMinimized は、trueならば最小化されています。

メモ:本体とPostmanのどちらから呼ばれたのかを判定するには、DatulaApi.GetMainWindow をして得られたinfoのframeWndとhWndが一致したら本体、と判断できます。

procedure OnNewPostmanInstance(hWnd: THandle);

 新しいPostmanが起動したときに呼び出されます。

 派生しなければ何もしません。

procedure OnDeletePostmanInstance(hWnd: THandle);

 Postmanのインスタンスが一つ閉じられたときに呼び出されます。

 派生しなければ何もしません。


Datula API

 Datula API (DatulaApi.pas) は以下のように変換してあります。詳しくは正式なDatula SDKを参照してください。

 TPLUGININFO = record
   sizeofStruct: cardinal; // size_t
   title: array[0..63] of char;
   version: array[0..15] of char;
   author: array[0..31] of char;
 end;
 PPLUGININFO = ^TPLUGININFO;

 TMainWindowInfo = record
frameWnd, folderTree, focusBox, messageList, headerPane, viewer: THandle;
end; TPostmanWindowInfo = record
signatureBox, attachmentBox, languageBox, editorView, attachmentView, signatureView: THandle;
end; TFHandler = procedure;

function AppendMenu(item: PChar; handler: TFHandler): boolean;

procedure DeleteMenu(handler: TFHandler);

procedure GetMainWindow(var info: TMainWindowInfo );

function GetPostmanWindow(frameWnd: THandle; var info:TPostmanWindowInfo): boolean;

function GetHeaderText: string;

function GetBodyText: string;

procedure RegisterPluginInfo(hInstance:THandle; const info:TPLUGININFO );

function GetVersion: cardinal;

 


注意事項

 ダイナミックリンクライブラリとして作成したメインモジュールのコメントには uses ShareMem; についての言及がありますが、これを使うとアンロードのときにアプリケーションエラーが出ますので、デフォルトのままにしましょう(笑)


サンプルのビルド

 試しに付属のサンプルを作成してみましょう。

  1. Delphiを起動し、新規作成 - ダイナミックリンクライブラリ を行う。
  2. プロジェクト - プロジェクトに追加 で、DatulaApi.pas, DatulaPlugin.pas, TestPlugin1.pas を追加する。
  3. ビルドする。このとき、プロジェクトの名前を聞かれるので、適当に名づけます。
  4. 出来上がったDLLファイルを DatulaのPluginsディレクトリにコピーし、Datulaでロードしてみましょう。
  5. ヘッダに「AONO」が含まれるメッセージを開いたときに音が鳴れば動作成功です(笑)。また、プラグインメニューにTestという項目が追加され、選ぶと Do Something! とだけ出る小さなダイアログが現れることも確認できるでしょう。

 あとはこれを元にいろいろと書き換えてみると良いでしょう。


修正履歴

2001-02-24 0.00 最初

2001-02-25 0.01 サンプルつけた

2001-02-25 0.02 サンプルまちがってた