形態素解析ツールの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 );

A 回答 (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);

補足日時:2001/05/08 12:58
    • good
    • 0
この回答へのお礼

ソースまで示していただき丁寧なご回答、本当にありがとうございました。教えていただいたコードを理解するため、DLLやポインタの参考書をひっくり返して調べておりまして御礼おくれてすみません。

なんとかおっしゃる方法で、KAKASIのDLLライブラリを動的に読み込み、動かすことができました。Chasenの方はライブラリのロードはできたのですが何らかの(chasenの使い方)の問題でまだうまく動いておりません。analyzeなど読み込んだ関数を使う場面でEAccessViolationのエラーがでてしまうのです。

とりあえずはKAKASIが動きましたのでやりたいことはできそうなのですが、Chasenが動かない状況も、勉強がてら解決したいので、もう少しがんばってみようと思います。

本当にありがとうございました!。

お礼日時:2001/05/07 19:51

DLLにLIBファイルは付属していたでしょうか?(拡張子*.LIB)



もし付属していたならば、リンクファイルに追加してください。
(VC用と書いてあったら無理ですね(笑))

もしVC用のLIBでしたら、LoadLibrary()とGetProcAdress()を使うしかないです。
これならばどのコンパイラでも使用できるはずです。
というか、先ほどのLIBファイルを使用できたとしても、こちらの方法で動的にリンクするほうがいいです。
    • good
    • 0
この回答へのお礼

質問者です。ご回答ありがとうございます。

LIBファイルはIMPLIBでBCB版を作成してみました。その上で、プロジェクトにLIBをファイルを追加したのですが、やはり結果は同じで外部シンボルの未解決によって、だめでした。

とりあえずご指摘のように、動的リンクしかなさそうなのでそちらで試してみたいと思います。

お礼日時:2001/05/05 02:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ