« MeCab (和布蕪) 辞書の構築 | メイン | Sennaのインストールレス化 »
2006年02月19日
Web関連の開発日誌:: MeCab の設定ファイル
Tweet @jin1016をフォローMeCab は実行時に mecabrc ファイルを参照する。
Windows環境下では、 mecabrc ファイルの位置はまずレジストリを参照して見つからなければ、デバッグオプションの MECAB_DEFAULT_RC で指定されたパスを見る。
そして、これはデフォルトだと c:\Program Files\mecab\etc\mecabrc になっている。
これだと任意の位置にMeCab を置きたい場合に困るので、何とかしたい。
そこで、DLLが置かれている位置と同じフォルダにmecabrc ファイルを置き、それを参照してくれるようにすることにした。
そこでまずはDllMainを次のように変更した。
HINSTANCE gDllInst = NULL;
BOOL __stdcall DllMain( HINSTANCE hInst, DWORD dwReason, void* )
{
if( gDllInst == NULL ) gDllInst = hInst;
return( TRUE );
}
BOOL __stdcall DllMain( HINSTANCE hInst, DWORD dwReason, void* )
{
if( gDllInst == NULL ) gDllInst = hInst;
return( TRUE );
}
次に、この変数を参照するために、tagger.cppの std::string getDefaultRc (Param ¶m) 関数の前に次のようにextern HINSTANCE gDllInstを追加。
#if defined (_WIN32) && ! defined (__CYGWIN__)
extern HINSTANCE gDllInst;
#endif
extern HINSTANCE gDllInst;
#endif
最後にstd::string getDefaultRc (Param ¶m) 関数内の return std::string (MECAB_DEFAULT_RC); の前のif define内に
vt = GetModuleFileName( gDllInst, v, size );
if(vt != 0)
{
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
_splitpath( v, drive, dir, NULL, NULL );
return std::string(drive) + std::string(dir) + std::string("mecabrc");
}
if(vt != 0)
{
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
_splitpath( v, drive, dir, NULL, NULL );
return std::string(drive) + std::string(dir) + std::string("mecabrc");
}
を追加した。
これで、MeCab がインストールされていなくてレジストリに登録されていない場合、DLLが置かれたディレクトリにあるmecabrc ファイルを参照してくれるようになる。
インストールなしでコピーするだけで使えるようにするには、こうなっていた方が使い勝手がいいだろう。
投稿者 Takenori : 2006年02月19日 19:12
comments powered by Disqus