WIN32/ひとりWikiプラグインを作る

私はひとりWiki用のプラグインをBCC5.5で作ってます。オリジナルのプラグインを作成したい方のために手順を残しておきます。

目次

準備

コンパイラの環境変数設定や統合環境の準備などは省略します。

プロジェクト設定

実行ファイル名 任意の名前を付けます。拡張子はDLLにします。
ターゲット Dynamic Link Library(-WD) とします。念のためマルチスレッドにチェックを入れます。

デバッグ用とリリース用の設定が切り替えられるようになっています。プラグインのコア部分を別モジュールに分離。リリース版はDLLを作成用、デバッグ版は確認用コンソールアプリが作成されるようにしておくと開発がスムーズかもしれません。

#ifdef DEBUG
  〜 main()関数を記述 〜
#else
  〜 DLL定義を記述 〜
#endif

骨組み

#include <windows.h>

windows.hを読み込みます。

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}

extern "C" {
    __declspec(dllexport) long __stdcall GetPluginType(void);
    __declspec(dllexport) BSTR __stdcall GetName(void);
    __declspec(dllexport) DWORD __stdcall GetVersion(void);
    __declspec(dllexport) BSTR __stdcall GetAuthor(void);
    __declspec(dllexport) BSTR __stdcall GetSyntax(void);
    __declspec(dllexport) BSTR __stdcall GetDescription(void);
    __declspec(dllexport) BSTR __stdcall GetExample(void);
    __declspec(dllexport) BSTR __stdcall PluginInline(
                                           LPCSTR EscapedString,
                                           LPCSTR PlainString,
                                           LPCSTR DocumentName,
                                           LPCSTR FileName,
                                           LPCSTR DocumentFolder,
                                           LPCSTR TemplateFolder,
                                           LPCSTR SettingsName
                                           );

}
//---------------------------------------------------------------------------
//                                                          プラグインタイプ
long __stdcall GetPluginType(void) {

    return(1);
}
//---------------------------------------------------------------------------
//                                                                プラグイン
BSTR __stdcall GetName(void) {

    return(SysAllocString(L"プラグインの名前"));
}
//---------------------------------------------------------------------------
//                                                                バージョン
#define DLL_VERSION  L"0.5.0"
DWORD __stdcall GetVersion(void) {

    return((DWORD)SysAllocString(DLL_VERSION));
}
//---------------------------------------------------------------------------
//                                                                    著作者
BSTR __stdcall GetAuthor(void) {

    return(SysAllocString(L"komina"));
}
//---------------------------------------------------------------------------
//                                                                      書式
BSTR __stdcall GetSyntax(void) {

    return(SysAllocString(L"書式の説明"));
}
//---------------------------------------------------------------------------
//                                                                      説明
BSTR __stdcall GetDescription(void) {

    return(SysAllocString(L"プラグインの説明"));
}
//---------------------------------------------------------------------------
//                                                                    使い方
BSTR __stdcall GetExample(void) {

    return(SysAllocString(L"プラグインの使用例"));
}
//---------------------------------------------------------------------------

PluginInline()にはメイン処理を記述する。

//---------------------------------------------------------------------------
//                                                                      処理
BSTR __stdcall PluginInline(
        LPCSTR EscapedString,  // 引数をエスケープ処理したもの
        LPCSTR PlainString,    // 引数
        LPCSTR DocumentName,   // 文書名
        LPCSTR FileName,       // ファイル名
        LPCSTR DocumentFolder, // 文書フォルダ名
        LPCSTR TemplateFolder, // テンプレートフォルダ名
        LPCSTR SettingsName    // (現在未使用)
        )
{
    BSTR ret;
    ret = SysAllocString(L"処理後文字列");
    return(ret);
}
//---------------------------------------------------------------------------

注意点

プラグインの結果を返す時、SysAllocString()関数を使います。文字列用メモリを確保して返し、受け取る側で解放する形になります。

また、文字列はワイド文字列を使用します。

動作確認

プラグインの動作確認用のツールもMASさんのサイトにて公開されています。

ひとりWikiについて>プラグインの作り方>ひとりWikiプラグインテスター、にて作成したプラグインの動作を確認することが出来ます。

Tips

C文字列からワイド文字列への変換

const char src = "こんにちはABC";
int len = MultiByteToWideChar(CP_ACP, 0, strlen(src), -1, NULL, 0);

if (len != 0) {
    wchar_t *temp = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, strlen(src), -1, temp, len);
    
    BSTR ret;
    ret = SysAllocString(temp);
    delete temp;
}

MultiByteToWideChar()関数を使って変換します。

参考リンク

ひとりWiki
作者のMASさんのホームページ
BCC Developer
BCC5.5の簡易統合環境
Borland C++ Compiler 5.5
ボーランドの無料コンパイラ
Borland Turbo Debugger 5.5
ボーランドの無料デバッガ(DLLには使えない)

2007-02-03 komina