Bekcy! plugin作製のメモ


何をしたいか

せこくて申し訳ないのですが、iniファイルにパターンをいくつも登録しておいてそこから正規表現を読み込んでアドレスを勝手にクリックすると言うものを作ろうとしました。私はメーラーにBecky!を用いているので、これを実現するためにはプラグインを書けばいいということになります。すごく参考にしたのはBeckyプラグインの作成方法です。うちの作製環境はVisualC++6.0 Professional editionで、Becky! Plug-in SDKを用いました。Windowsプログラムはあんまり得意ではないのであほなこと書いてるかも知れませんが。仕様書があんまり親切じゃないので、いちいち返り値をC:\test.txtみたいなファイルに保存して見てるので手間は結構掛かりますねえ。

CBeckyAPI関数呼び出し

私の理解力が足りないのか知らないんですが、template.cppのしょっぱなにCBeckyAPIクラスの唯一のインスタンスとしてbka;という宣言があります。CBeckyAPI::関数()はbka.GetText()みたいな感じで呼び出せばいいようです。

インストールパス取得(カレントディレクトリ)

何かちょこちょこ動くみたいなんで、グローバル変数としてFILE* INIを取って、しょっぱなの呼び出し時(int WINAPI BKC_OnStart())でPlugin/なんとか.iniをオープン、Becky!終了時(int WINAPI BKC_OnExit())でクローズしました。librx.dllはB2.EXEのあるディレクトリに置いたら動作しました。こうした動作に必要なdllが見つからないときは、プラグインは登録されないようです。たぶんWindowsのシステム関係のパスが通ってるところに置いたら良いんじゃないでしょうか。デスクトップのショートカットを踏むかB2\B2.EXEを踏むかでカレントディレクトリが変わったり、右クリックから呼び出すごとに、何かちょこちょこ動くみたいなんで、SDKを使ったレジストリ操作に従って"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\B2"によって取得すれば良いみたいです。ていうかWindowsアプリケーションに一般的な方法みたいですね(汗)。

TreeView,ListView

Becky!の取り説のまんまです。左のディレクトリツリー構造になってるところがツリービュー、個々のメールの題名とかが表示されてるところがリストビューだそうです。メインメニューはウィンドウ上部にある「ファイル」とかのところで、デフォルトでcase BKC_MENU_MAIN:以下に追加したい項目の例が書かれてます。フォルダを右クリックしたときにメニューを追加したいときは、case BKC_MENU_TREEVIEW:以下に以下みたいな感じで追加すればOKです。多分リストビューの右クリック時のリストにアイテムを追加したいときはcase BKC_MENU_LISTVIEW:以下に追加すればいいのでしょう。

UINT nID = bka.RegisterCommand("大熊猫テストサンプル", nType,CmdProc);
InsertMenu(hMenu, 22, MF_BYPOSITION | MF_STRING, nID, "大熊猫なんたらかんたら");

メインメニューの場合はメニューの下にぶら下がってる項目にさらにぶら下げるのでHMENU hSubMenu = GetSubMenu(hMenu, 4);みたいな事をしてサブメニューを得なければいけませんが、TreeViewの場合はとりあえずメニューが一つしかなくてその中に直接追加するしかないので、上記のようにint WINAPI BKC_OnMenuInit(HWND hWnd, HMENU hMenu, int nType)の引数のhMenuをそのまま渡してやればOKです。

GetCurrentFolder()

Becky!はフォルダ、個々のメールについてファイルシステム上の名前と、それに相当するメーラー上のフォルダ名とメール題名と二つの名前があります。GetCurrentFolder()を実行してファイルに吐き出して調べてみたところ、「3e8332f4.mb\!!!!Inbox\ookumaneko\」のように現在選択中のフォルダのファイルシステム上のパスを記述した文字列へのへのポインタが返って来るみたい。

GetFolderDisplayName(lpFolderID)

ファイルに吐き出して調べたところ、ファイルシステム上のパスを引数に呼び出すと「[Nifty] 受信箱/ookumaneko」 見たいな感じでメーラー上でのフォルダの文字列へのポインタが返ってくる。

SetCurrentMail(szMailID)

フォルダ選択時にはリストビューのメール一覧が見えるだけで、どのメールも選択されてなくて、メール本文も表示されません。bka.SetCurrentMail(szMailID)でメール実体をフルパスで渡してやるとそのメールが選択状態になってメール本文が表示されます。

GetText()

現在選択中のメール本文がShift-JISでCBeckyAPIが確保したバッファに出てきます。そのバッファへのポインタが返り値になります。文字コードは何だろうというのでこれをそのまんまfputc()なんかで保存すると改行コードは0Dh,0Dh,0Ahと続いています。0Dh,0Ahじゃ駄目なのか・・・。別に良いけど。

EUC_JP(LPCSTR,BOOL)

GetTextからメール本文はShift_JISでよこされます。これのアドレスを第1引数、第2引数をTRUEにして呼び出すとEUC_JPになって返ってきます。FALSEにすると逆になるんでしょう。きっと。

GNU Rx

VisualC++6.0は正規表現のライブラリがありません。Boostはエラーが出てコンパイルできないので、結局GNU Rxということになりました。regex Tipsがなかなか分かりやすいんですが、現在繋がらないですねえ。Internet Archiveに行けばバイナリも手に入ります。PERLでのCGIなんかは書いた経験があるんですが、POSIXの正規表現はまたちょっと違っててこずりましたねえ。

記述例