形態素解析ツールの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 );
No.1
- 回答日時:
DLLにLIBファイルは付属していたでしょうか?(拡張子*.LIB)
もし付属していたならば、リンクファイルに追加してください。
(VC用と書いてあったら無理ですね(笑))
もしVC用のLIBでしたら、LoadLibrary()とGetProcAdress()を使うしかないです。
これならばどのコンパイラでも使用できるはずです。
というか、先ほどのLIBファイルを使用できたとしても、こちらの方法で動的にリンクするほうがいいです。
質問者です。ご回答ありがとうございます。
LIBファイルはIMPLIBでBCB版を作成してみました。その上で、プロジェクトにLIBをファイルを追加したのですが、やはり結果は同じで外部シンボルの未解決によって、だめでした。
とりあえずご指摘のように、動的リンクしかなさそうなのでそちらで試してみたいと思います。
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とする必要が
あるかもしれません。
この回答への補足
同じことをしたい方が後にいるときのために私の現状のメモを残させてください。
以下のように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);
ソースまで示していただき丁寧なご回答、本当にありがとうございました。教えていただいたコードを理解するため、DLLやポインタの参考書をひっくり返して調べておりまして御礼おくれてすみません。
なんとかおっしゃる方法で、KAKASIのDLLライブラリを動的に読み込み、動かすことができました。Chasenの方はライブラリのロードはできたのですが何らかの(chasenの使い方)の問題でまだうまく動いておりません。analyzeなど読み込んだ関数を使う場面でEAccessViolationのエラーがでてしまうのです。
とりあえずはKAKASIが動きましたのでやりたいことはできそうなのですが、Chasenが動かない状況も、勉強がてら解決したいので、もう少しがんばってみようと思います。
本当にありがとうございました!。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報