• ベストアンサー

Chasen.dllをBCB5で使う方法を教えてください(DLLの使い方)

形態素解析ツールのChasen Win32版に付属しているchasen.dllを自作のプログラムから呼び出したいと思っています。 ・茶筅 http://chasen.aist-nara.ac.jp/index.html.ja ですが、DLLを使ったことがないのでよくわからずもう何日も困っています。 ヘッダで、まずDLL付属のヘッダー(下記参考資料)をインクルードして、 #include "chadll.h" 自作プログラムのソースで、 HINSTANCE chasenDLL = LoadLibrary("chasen.dll"); でライブラリをロードして、 char *myanalyze = (char *)GetProcAddress(chasenDLL,"analyze"); で関数analyzeを取り出していますが、 analyze()を実際に使うとシンボルの未解決エラーでコンパイルできません。 このDLLはBCBでは使えないのでしょうか。 ---------------------参考資料:DLL付属のサンプルソース /* * dlltest.c - ChaSen dll test program * * Copyright (C) 2000 Nara Institute of Science and Technology * * Author: H.Matsuda <horosi-m@is.aist-nara.ac.jp>, Sep. 2000 */ #include <stdio.h> #include "chadll.h" int main( int argc, char** argv ) { char input[10000] = "これは形態素解析のテストです。"; set_argument_parameters( argc, argv ); printf( "%s", analyze( input ) ); } ---------------------参考資料:DLL付属のヘッダーファイル /* * chasendll.h - ChaSen dll header * * Copyright (C) 2000 Nara Institute of Science and Technology * * Author: H.Matsuda <horosi-m@is.aist-nara.ac.jp>, Sep. 2000 */ __declspec( dllexport ) int set_argument_parameters( int argc, char** argv ); __declspec( dllexport ) char* analyze( char* input );

質問者が選んだベストアンサー

  • ベストアンサー
  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

Chasenを使い前にDLLの使い方を勉強しましょう。 DLLの利用の仕方でStatic LinkとDynamic Linkの2通り があることをご存じですか? このサンプルはStatic Linkの例です。 したがってBCB5用のchasen.libというファイルが 必要になります。おそらく付属のlibファイルは VC用でしょう。 implib.exeを使ったような気がします、、、 Dynamic Linkを使うのであれば、 typedef char* WINAPI (*TAnalyze)(char*); TAnalyze analyze; HINSTANCE cDLL; cDLL = LoadLibrary("chasen.dll"); myanalyze = (TAnalyze)GetProcAddress(cDLL,"analyze"); の様に記述する必要があります。 注意としてGetProcAddress(cDLL,"xxxxxx"); のxxxxxxの部分は状況に応じて_xxxxxxとする必要が あるかもしれません。

Blogger
質問者

お礼

ソースまで示していただき丁寧なご回答、本当にありがとうございました。教えていただいたコードを理解するため、DLLやポインタの参考書をひっくり返して調べておりまして御礼おくれてすみません。 なんとかおっしゃる方法で、KAKASIのDLLライブラリを動的に読み込み、動かすことができました。Chasenの方はライブラリのロードはできたのですが何らかの(chasenの使い方)の問題でまだうまく動いておりません。analyzeなど読み込んだ関数を使う場面でEAccessViolationのエラーがでてしまうのです。 とりあえずはKAKASIが動きましたのでやりたいことはできそうなのですが、Chasenが動かない状況も、勉強がてら解決したいので、もう少しがんばってみようと思います。 本当にありがとうございました!。

Blogger
質問者

補足

同じことをしたい方が後にいるときのために私の現状のメモを残させてください。 以下のようにChasen.dllを呼び出しました。すると関数を使おうとするところで、EAccessViolationが発生します。 ----------------------------------------------- void __fastcall TLogoAppForm::BitBtn1Click(TObject *Sender) { typedef char* WINAPI (*TAnalyze)(char*); TAnalyze analyze; typedef int WINAPI (*TSetArgParm)(int argc,char** argv); TSetArgParm set_argument_parameters; char *argv[] = {"-a", "-r"}; HINSTANCE cDLL; char *input = "解析したい文字列"; cDLL = LoadLibrary("chasen.dll"); if (cDLL) RichEdit1->Lines->Add("LoadDLL成功"); analyze = (TAnalyze)GetProcAddress(cDLL,"analyze"); if (analyze) RichEdit1->Lines->Add("analyze関数取得成功"); set_argument_parameters = (TSetArgParm)GetProcAddress(cDLL,"set_argument_parameters"); if (set_argument_parameters) RichEdit1->Lines->Add("set_argument_parameters関数取得成功"); AnsiString StrTest; StrTest = analyze(input); FreeLibrary(cDLL);

その他の回答 (1)

  • jun_l
  • ベストアンサー率18% (4/22)
回答No.1

DLLにLIBファイルは付属していたでしょうか?(拡張子*.LIB) もし付属していたならば、リンクファイルに追加してください。 (VC用と書いてあったら無理ですね(笑)) もしVC用のLIBでしたら、LoadLibrary()とGetProcAdress()を使うしかないです。 これならばどのコンパイラでも使用できるはずです。 というか、先ほどのLIBファイルを使用できたとしても、こちらの方法で動的にリンクするほうがいいです。

Blogger
質問者

お礼

質問者です。ご回答ありがとうございます。 LIBファイルはIMPLIBでBCB版を作成してみました。その上で、プロジェクトにLIBをファイルを追加したのですが、やはり結果は同じで外部シンボルの未解決によって、だめでした。 とりあえずご指摘のように、動的リンクしかなさそうなのでそちらで試してみたいと思います。

関連するQ&A