fukum****@amber*****
fukum****@amber*****
2010年 1月 7日 (木) 09:32:36 JST
福光です。 回答ありがとうございました。 アドバイスを元に以下のように修正してみましたが、 残念ながら、まだうまく動きません。。。 ' 以下コード ************************** ' MeCab: 0.98(Windowsバイナリ) + Excel2003 ' ' 「問題が発生したため、Microsoft Office Excel を終了します。」で ' 異常終了してしまう。 Declare Sub mecab_destroy Lib "libmecab.dll" (ByVal m As Long) Declare Function mecab_sparse_tostr Lib "libmecab.dll" (ByVal m As Long, ByVal str As String) As String Declare Function mecab_new2 Lib "libmecab.dll" (ByVal arg As String) As Long Sub MorphTest2() Dim SouceText As String SouceText = "すもももももももものうち" PtrMecab = mecab_new2(vbNullString) Debug.Print mecab_sparse_tostr(PtrMecab, 文字列) Call mecab_destroy(PtrMecab) End Sub ' コードここまで。********************** > mecab_new2 の引数に渡す文字列は、SouceText ではありませんよ。 VB2005のサンプルコードで String.Empty を渡しているものがあったので、 vbNullString を渡してみました。 http://homepage1.nifty.com/yasunari/VB/VB2005/MeCab.htm お気づきの点等ありましたら、アドバイス等いただければ幸いです。 ----- Original Message ----- From: "Tadamasa Teranishi" <yw3t-****@asahi*****> Cc: <mecab****@lists*****> Sent: Thursday, January 07, 2010 5:18 AM Subject: [mecab-users 393] Re:Excel VBA からMeCabを使用するには? > 寺西です。 > > 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 > > _______________________________________________ > mecab-users mailing list > mecab****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/mecab-users >