Tadamasa Teranishi
yw3t-****@asahi*****
2010年 1月 7日 (木) 05:18:51 JST
寺西です。 fukum****@amber***** wrote: > > ' MeCab: 0.98(Windowsバイナリ) + Excel2003 > ' > ' PtrMecab = mecab_new2(SouceText) のところで > ' 「実行時エラー'49': DLLが正しく呼び出せません。」というエラーが出てしまう。 宣言に問題ありますから...。 > Declare Function mecab_destroy Lib "libmecab.dll" (ByVal m As String) > Declare Function mecab_sparse_tostr Lib "libmecab.dll" (ByVal m As String, > ByVal str As String) > Declare Function mecab_new2 Lib "libmecab.dll" (ByVal arg As String) 以下の3つの関数だけ使うのなら mecab_t *mecab_new2 (const char *arg) const char *mecab_sparse_tostr (mecab_t *m, const char *str) void mecab_destroy(mecab_t *m) mecab_destroy は値を返さない関数なので Function じゃなくて Sub では ないかと思います。 また、mecab_new2 と mecab_sparse_tostr は Function なので戻り値の型を 宣言しないといけないと思います。 Declare Sub mecab_destroy Lib "libmecab.dll" (ByVal m As String) Declare Function mecab_sparse_tostr Lib "libmecab.dll" (ByVal m As String, ByVal str As String) As String Declare Function mecab_new2 Lib "libmecab.dll" (ByVal arg As String) As Long としてみてはどうでしょう。 # 未確認なので動かなくても許してくださいね。 > Sub MorphTest() > > Dim SouceText As String > > SouceText = "すもももももももものうち" > PtrMecab = mecab_new2(SouceText) > Debug.Print mecab_sparse_tostr(PtrMecab, SouceText) > > End Sub mecab_new2 の引数に渡す文字列は、SouceText ではありませんよ。 どこかで mecab_destroy を呼ばないとメモリリークになりますよ。 > (1) Declareステートメントで宣言する際、引数の型および戻り値の型に何を使用すればよいか? Cの関数仕様に合わせて対応するものを指定しなければなりません。 ユーザ定義の (mecab_t *) については中身を VBA 側で触らないのなら Long で良いのではないかと思います。 > (2) ByRef(参照渡し), ByVal(値渡し)どちらを使うのが適切なのか? これについてはきちんと調べた方が良いですよ。重要な話ですから。 今回の3つの関数の引数の場合は ByVal で良いと思います。 > 解決に必要な知識はMeCabから少しそれてしまっている気もしますが。。。 まぁ、VBA から使えるとうれしいという方もいらっしゃるでしょうから、 良いのではないでしょうか。 -- ===================================================================== 寺西 忠勝(TADAMASA TERANISHI) yw3t-****@asahi***** http://www.asahi-net.or.jp/~yw3t-trns/index.htm Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E