- ベストアンサー
C/C++で漢字の読みを取得する方法
- C/C++で漢字の読みを取得する方法について質問です。以下のコードで実行時エラーが発生してしまいます。解決策を教えてください。
- 初心者のため、ライブラリの設定やプロジェクトの設定方法を教えていただけませんか?また、ソースコードの一部も教えていただけると幸いです。
- 動作させるためには、libkakasi.hやkakasi.libなどの必要ファイルの場所を教えていただけませんか?
- みんなの回答 (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; }
その他の回答 (3)
- Wr5
- ベストアンサー率53% (2173/4061)
質問に答えていなかったようなので、回答します。 # ただし、そちらの環境は掲示されていないようですので、当方の環境で…ですが。 >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 と表示されます。
お礼
解決できました。 完全なご回答を頂きありがとうございます。 教えて頂いた知識を調べ理解しようと思います。 本当に助かりました。
- bluecampus
- ベストアンサー率66% (138/209)
とりあえず、エラーチェックは最低限しましょう。 というか前から回答が付いていたような気まするけど・・・ >HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); 拡張子が .dll のフルパスを指定する。 C:\kakasi\bin\kakasi.dll だったら HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin\\kakasi.dll"); そして、正常にロードできているか戻り値を確認する。 NULLであれば、dllの場所が違う。 そもそも、ヘッダファイルとライブラリファイルをリンクするのであれば、 動的リンクであるLoadLibraryを使わなくてもいいのですが。
お礼
おかげさまで動作しました。 libやdllを理解しなければならないと思います。 助かりました。 ありがとうございます。
- Wr5
- ベストアンサー率53% (2173/4061)
http://okwave.jp/qa/q6050258.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になっていることでしょう。 エラー処理を一切していないので当たり前の結果となります。
お礼
おかげさまで動作しました。 すみません再度質問する前に、難しすぎて迷っていて このような失礼をしてしまいました。 今後気をつけます。 ありがとうございました。
お礼
いつもご回答ありがとうございます。 無視してしまってすみませんでした。 エラー処理も大変参考になりました。 以前の質問も含め、全ての方がベストアンサーだと感じております。 今後ともご教授お願いいたします。 本当にありがとうござしました。