BeckyAPIの利用

Becky Pligin SDK で提供されている機能には、コールバック関数のほかに静的に呼び出し可能なたくさんの関数が用意されています。

実際に BeckyAPI の関数を呼び出すプログラムを作ってみます。

ご存知のように、Becky! のメールボックスはデータフォルダで指定された場所に、 4bac86fe.mb などの英数字で構成されたフォルダごとに分かれています。
何らかの理由でデータフォルダを直接さわりたい場合などに、メールボックスがたくさんあると、いったいどのフォルダがどのメールアドレスに結び付いているのかわからなくて苦労しますね。
※Becky! の受信メールを右クリックして「メールのプロパティ」を開くことでどこなのかはわかるようになっていますが、そこは置いといて(笑)、チュートリアルとして実装してみます。

BeckyAPIはどこにある?

BeckyAPI は、Becky Plugin SDK に含まれています。
ダウンロードして展開した、PluginSDK フォルダに BeckyApi.h というヘッダファイルがあり、その関数を利用します。
PluginSDK フォルダには PluginSDK.txt というドキュメントがあります。
BeckyAPIの利用方法については、このドキュメントを参照してください。

プラグインロジッククラスの SPluginLogic を利用していれば、正しく初期化された BeckyAPI クラスポインタを保持していますので、新規に初期化や作成せずに利用できるようになっています。

ここでは次のような関数を使用します

  1. BeckyAPI::GetDataFolder()
    データフォルダを取得します。
  2. BeckyAPI::GetCurrentFolder()
    現在のメールボックスのフォルダ名を取得します。

これだけわかればあとは簡単。2つをくっつけたパス名がメールボックスのデータフォルダということになりますね。
では実際にコードを書いてみましょう。
前回のプロジェクトでメッセージボックスを表示した、「プラグインの設定」メニューの位置を次のように変えてみます。

    
int SampleLogic::OnPlugInSetup(HWND handle)
{
	// 1.BeckyAPIを使ってデータフォルダのパスを取得します。
	char *dataFolder = _strdup(BeckyAPI->GetDataFolder());
	if (dataFolder == NULL)
	{
		return 1;
	}

	// 2.BeckyAPIを使って現在のメールボックスフォルダを取得します。
	char *currentFolder = _strdup(BeckyAPI->GetCurrentFolder());
	if (currentFolder == NULL)
	{
		return 1;
	}

	// 3.パス名を合成します
	char fullPath[MAX_PATH];
	_makepath_s(fullPath, sizeof(fullPath), NULL, dataFolder, currentFolder, NULL);

	// 4.表示する内容を組み立てます。
	char message[MAX_PATH + 512];
	sprintf_s(message, sizeof(message), "メールボックスのパスは\n%s\nです", fullPath);

	// 5.メッセージボックスを表示します
	MessageBox(handle, message, "SamplePlugin", MB_OK);

	// 6. 後始末。_strdup() で確保されたメモリを開放します。
	free(currentFolder);
	free(dataFolder);
	return 1;
}
    
    

実行してみましょう。

うまく表示されました。

Becky API を利用する上での注意

今回利用した、GetDataFolder, GetCurrentFolder も含め Becky API では、API側で確保されたメモリ領域のポインタを返す関数が多くあります。
関数の説明には、確保された領域についてはコールバックを抜ける時点で自動的に解放される、と記述されていますので、_strdup() を使ってわざわざ別の領域にコピーしてfree()で解放することは不要に思えますね。

弊社の経験ではプラグインのコールバック関数のコンテキスト実行中に Becky! の別スレッドが並行して実行された場合に API に用意されていた領域が破壊されてしまうことがありました。

_strdup() 関数を使ってコピーしておき、処理が終了したら開放する手続きを取っておいたほうが危険性が少ないと思います。

補足事項

データフォルダについてですが、BeckyPlugin ライブラリでは、SFolderList クラスがメールボックスフォルダのリストを持ちます。
SFolderList::GetMailBoxes() メソッドで、メールアドレスとフォルダーのフルパス名の一覧を取得できます。
BeckyPluginライブラリドキュメントの SFolderList クラスを参照してください。