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 スキップ ==========
*/
No.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;
}
いつもご回答ありがとうございます。
無視してしまってすみませんでした。
エラー処理も大変参考になりました。
以前の質問も含め、全ての方がベストアンサーだと感じております。
今後ともご教授お願いいたします。
本当にありがとうござしました。
No.3
- 回答日時:
質問に答えていなかったようなので、回答します。
# ただし、そちらの環境は掲示されていないようですので、当方の環境で…ですが。
>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
と表示されます。
No.2
- 回答日時:
とりあえず、エラーチェックは最低限しましょう。
というか前から回答が付いていたような気まするけど・・・
>HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin");
拡張子が .dll のフルパスを指定する。
C:\kakasi\bin\kakasi.dll だったら
HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin\\kakasi.dll");
そして、正常にロードできているか戻り値を確認する。
NULLであれば、dllの場所が違う。
そもそも、ヘッダファイルとライブラリファイルをリンクするのであれば、
動的リンクであるLoadLibraryを使わなくてもいいのですが。
No.1
- 回答日時:
で、
>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になっていることでしょう。
エラー処理を一切していないので当たり前の結果となります。
おかげさまで動作しました。
すみません再度質問する前に、難しすぎて迷っていて
このような失礼をしてしまいました。
今後気をつけます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
fgetsなどのときのstdinのバッ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
charでの計算?
-
sprintfに同じ変数は使えるか
-
C言語の入力した文字を反転させ...
-
CStringをwchar_tに変換したい
-
YUV⇔RGB変換がうまくいきません。
-
絶対パスからのファイル名の切...
-
C言語です
-
strncpyと_tcsncpy_sのヌルの扱...
-
C言語のfor文です。 繰り返しの...
-
atoi( ) の反対をやりたい
-
C言語のポインターで詰まっている
-
データの取得をしたいのですが…
-
下記のプログラムがコンパイラ...
-
間接参照のレベルが異なっています
-
型変換
-
C言語 ミリ秒を日付に変換には
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charでの計算?
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
fgetsなどのときのstdinのバッ...
-
'const char *' 型は 'char *' ...
-
間接参照のレベルが異なっています
-
double型の値をchar配列に変換...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
ネットワークにつながっている...
-
型変換
-
テキストデータをそのままバイ...
-
文字列ポインタを結合
-
3桁区切(コンマ)記号をつけ...
-
C言語です
-
Win32APIでのエディットボック...
-
TCHAR文字列?の特定部分の数字...
-
絶対パスからのファイル名の切...
おすすめ情報