【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください

C/C++で漢字の読みを取得したいです。

以下のコードで、エラーと警告は出ないのですが、実行時エラーになします。
実行時エラー:○○.exeは動作を停止しました。
どこが問題なのか解りません。

漠然としていて申し訳ありませんが、
ライブラリというものが何なのか解っていない初心者です。
Windouwsで設定も含めて、手順を教えていただけませんでしょうか。
おそらくひとつの回答では文字数が足りない程のだと思いますので、絞ると

1.libkakasi.hやkakasi.libなどの必要ファイルの置く場所
2.プロジェクトの設定
3.ソースコード

を教えていただきたいです。
まずは動かしたいので理論的なことは後で調べようと思います。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include"libkakasi.h"
void main(void){
HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin");
int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );;
char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" );
int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" );
char* argv[] = {"kakasi", "-JH","-kH"};
kakasi_getopt_argv(3,argv);
char* hiragana = kakasi_do("文");
printf("%s\n", hiragana);

printf("%s\n", "a");
kakasi_free(hiragana);
FreeLibrary(hKakasiDLL);
}
/*
1>------ ビルド開始: プロジェクト: oto_0714, 構成: Debug Win32 ------
1>コンパイルしています...
1>oto_0714.cpp
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>ビルドログは "file://c:\Users\me\Documents\Visual Studio 2005\Projects\oto_0714\Debug\BuildLog.htm" に保存されました。
1>oto_0714 - エラー 0、警告 0
========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ==========
*/

A 回答 (4件)

無視されたけどめげずに答えましょう


1. libkakasi.hとkakasi.libとkakasi.dllの3個のファイルを
C\Users\me\Documents\Visual Studio 2005\Projects\oto_0714\
にコピーします
2. ソースファイル名をoto_0714.cに変えます
3. プログラムは以下の通り
#pragma comment(lib, "kakasi.lib")
#include <stdio.h>
#include "libkakasi.h"

int main(void)
{
char* hiragana = NULL;
char* argv[] = {"kakasi", "-JH", "-kH"};
if(kakasi_getopt_argv(3, argv) != 0)
{
printf("error1\n");
return 0;
}
hiragana = kakasi_do("文");
if(hiragana == NULL)
{
printf("error2\n");
return 0;
}
printf("%s\n", hiragana);
printf("%s\n", "a");
kakasi_free(hiragana);
return 0;
}
    • good
    • 0
この回答へのお礼

いつもご回答ありがとうございます。
無視してしまってすみませんでした。
エラー処理も大変参考になりました。
以前の質問も含め、全ての方がベストアンサーだと感じております。
今後ともご教授お願いいたします。
本当にありがとうござしました。

お礼日時:2010/07/20 14:59

質問に答えていなかったようなので、回答します。


# ただし、そちらの環境は掲示されていないようですので、当方の環境で…ですが。

>1.libkakasi.hやkakasi.libなどの必要ファイルの置く場所
>2.プロジェクトの設定
>3.ソースコード


1.について…
kakasi-2.3.4.zipを展開して、ディレクトリごとC:\にコピーします。

付属のドキュメントに従って、環境変数を設定します。
WindowsXPなので、システムのプロパティからユーザー環境変数に設定します。
設定内容は付属ドキュメント(README-ja.win32)の40行目から記述されている通りです。
ただのテキストですから、そのままメモ帳なりで開いて下さい。
# ただし、当方ではpathの設定は行っていません。

2.について…
Microsoft Visual C++ 2008 Express Editionを起動し、新規プロジェクトの作成に入ります。
[ファイル][新規作成][プロジェクト]で、「Win32 コンソール アプリケーション」で作成、
「空のプロジェクト」として作成します。
作成後、プロジェクトのプロパティを開き、文字セットを「マルチ バイト文字セットを使用する」に
変更して、一度閉じます。
ソリューションエクスプローラのソースで右クリックし、[追加][新しい項目]でプロジェクトにソースを追加します。
中身は空ですが、後ほど編集することにして…
再度プロジェクトのプロパティを開きます。
「C/C++」という項目が追加されているはずですので、そちらをクリックし、
右側の「追加のインクルード ディレクトリ」に「C:\kakasi\include」を設定して閉じます。

3.ソースコードについて…
質問に掲示されたソースコードを貼り付けます。
再三指摘しているLoadLibrary()を
"C:\\kakasi\\bin"から"C:\\kakasi\\lib\\kakasi.dll"に書き換えます。
# 当方ではpathを変更しませんでしたので、
# char* argv[] = {"kakasi", "-JH","-kH"};
# を
# char* argv[] = {"C:\\kakasi\\bin\\kakasi", "-JH","-kH"};
# に変更しています。

ビルドして実行するとコンソールに
ぶん
a
と表示されます。
    • good
    • 0
この回答へのお礼

解決できました。
完全なご回答を頂きありがとうございます。
教えて頂いた知識を調べ理解しようと思います。
本当に助かりました。

お礼日時:2010/07/20 14:53

とりあえず、エラーチェックは最低限しましょう。


というか前から回答が付いていたような気まするけど・・・

>HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin");
拡張子が .dll のフルパスを指定する。

C:\kakasi\bin\kakasi.dll だったら

HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin\\kakasi.dll");

そして、正常にロードできているか戻り値を確認する。
NULLであれば、dllの場所が違う。



そもそも、ヘッダファイルとライブラリファイルをリンクするのであれば、
動的リンクであるLoadLibraryを使わなくてもいいのですが。
    • good
    • 0
この回答へのお礼

おかげさまで動作しました。
libやdllを理解しなければならないと思います。
助かりました。
ありがとうございます。

お礼日時:2010/07/20 14:47

http://oshiete.goo.ne.jp/qa/6050258.html
で、
>HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin");
はまずい。
と、回答が2つも付いていますよね?
そちらは無視ですか?

私の回答では具体的な修正ケースを記述していませんが、
php504さんがDLLの名前まで記載してくれていますよね?
フルパスで書かないと通じませんか?

で、なぜ落ちているのかというと…
LoadLibrary()に失敗しているのに突撃している為、
GetProcAddress()がNULLポインタを返却しているハズです。
そして、こちらでも失敗しているのに特攻してNULLポインタアクセスでOSにより救済され、
お行儀の悪いプロセスだけが殺された結果です。
停止した際にIDEなどでデバッグしようとすると、kakasi_getopt_argv()の行でエラーになっているハズです。
その際、変数の内容を確認出来る状態であれば、
hKakasiDLL・kakasi_getopt_argv・kakasi_do・kakasi_freeの全てがNULLになっていることでしょう。
エラー処理を一切していないので当たり前の結果となります。
    • good
    • 0
この回答へのお礼

おかげさまで動作しました。
すみません再度質問する前に、難しすぎて迷っていて
このような失礼をしてしまいました。
今後気をつけます。
ありがとうございました。

お礼日時:2010/07/20 14:51

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


おすすめ情報