環境: WinXp(SP2) VC++2005.net(MFC)
1GBのテキストファイルと30MBのテキストファイルを開き、必要なデータを取り込む
プログラムを作っています。
ファイル選択ダイアログを3回表示されて、ファイル名を取得したいのですが、
時々途中で固まってしまいます。
1度固まると、パソコンを再起動しない限り、毎回固まります。
固まる箇所は、ダイアログボックスでファイルを選択して、OKボタンを押した時で
す。
原因として何が考えられるのでしょうか?
何でも構いませんので、アドバイスをお願い致します。
ソースも載せておきます。
char file_name1[MAX_PATH];
char file_name2[MAX_PATH];
char file_name3[MAX_PATH];
CFileDialog fd1(
TRUE,
_T(*.txt),
_T("),
OFN_FILEMUSTEXIST|
OFN_HIDEREADONLY|
OFN_LONGNAMES,
_T(データ1(*.txt)|*.txt|)
_T(All Files (*.*)|*.*||),
NULL
);
if( fd1.DoModal() != IDOK )
return;
CFileDialog fd2(
:
:
);
if( fd2.DoModal() != IDOK )
return;
CFileDialog fd3(
:
:
);
if( fd3.DoModal() != IDOK )
return;
// ファイル名の格納(渡す関数がC言語ベースのため、char型に変換)
strcpy_s( file_name1, sizeof(file_name1), (char*)LPCTSTR(fd1.GetPathName()) );
strcpy_s( file_name2, sizeof(file_name2), (char*)LPCTSTR(fd2.GetPathName()) );
strcpy_s( file_name3, sizeof(file_name3), (char*)LPCTSTR(fd3.GetPathName()) );
漢字やカナを含んでいるとき、
file_name1,2,3 にはちゃんとした文字列が入ってきてますか?
お返事ありがとうございます。
漢字やカナを含んでいる時も、きちんと文字列は入ってきています。
>固まる箇所は、ダイアログボックスでファイルを選択して、OKボタンを押した時で
す。
どのダイアログボックスですか?
fd1, 2, 3のファイル選択ファイアログのどれですか?
CFileDialog::GetPathName()の戻り値はCStringなのでLPCTSTRにキャストするまでは
いいですが、それをさらにchar*にキャストしてるのが危険な気がします。
VC++2005ではデフォルトでUnicodeを使用しますので
設定がそのままの場合、LPCTSTRはconst wchar_t*になります。
const wchar_t*からchar*に変換した際の動作は未定義のはずです。
charをTCHARに変えて、strcpy_sを_tcscpy_sに変えるとうまくいくかもしれません。
それ、これは
(char*)LPCTSTR(fd1.GetPathName())
こうしましょう。
LPCTSTR(fd1.GetPathName())
誤字訂正
>それ、これは
それと、これは
> charをTCHARに変えて、strcpy_sを_tcscpy_sに変えるとうまくいくかもしれません。
この場合、_tcscpy_sの第二引数sizeof(file_name1)をsizeof(file_name1)/sizeof
(file_name1[0])またはMAX_PATHに変えておくことをお忘れなく。
アキラさん、maruさん、お返事ありがとうございます。
固まるダイアログボックスは、不定です。
1つ目で固まる時もありますし、2つ目の時もあります。
また、VC++2005の設定は、マルチバイト文字を使うようにしてあります。
キャストのやり方を直して試してみます。
------------------------------------------------------------------------
関係ないお話になるかも知れませんが、パソコンの調子が悪いようです。(T_T)
何もプログラムを起動してない状態でも、CPUの使用率が50~100%、
メモリ使用量も通常の2倍以上になり、フル稼動状態になったりで不安定です。
今回、固まるのは、もしかしたらこれが原因かな?って思いました。
システムの復元でも安定しないので、OSを修復インストールするつもりです。
もしかしたら、これで直るかも知れません。結果はまたご連絡致します。
CFileDialogを使用するとAdobeReaderが違反を起こして止まるみたいです。
ひょっとしたらこれが原因かも。私はこれが原因でした;;
参考
ttp://blog.so-net.ne.jp/cadse/2007-03-02
ご連絡が遅くなり申し訳ありません。(延々と悩み続けてました;;;)
似たようなことが さん
お返事ありがとうございます。
Adobe Reader7が違反して件については、他のサイトで読みましたが、
教えて頂いたサイトも見てみます。
アキラさん、maruさん
教えて頂いた通りにやってみましたが、結果は変わりませんでした。
でも、今後は教えて頂いた内容でコーディングします。
大変勉強になりました。
>ファイル選択ダイアログを3回表示されて、ファイル名を取得したいのですが、
>時々途中で固まってしまいます
私が最初に書いた内容は少し間違っていました。正確には「固まる」ではなくて
「動作が遅くなる?」でした。そのままにしておくと、忘れた頃に動き出します。
PC自体の調子も悪いので、OSを再インストールしましたが、
結果は変わりませんでした。
試しに実行ファイルを別のPCで起動させてみたら、問題なく動きました。
何が原因が分かりませんが、問題は別のところにあるのかも知れません。
ファイル選択とは関係ないかも知れませんので、これで解決としておきます。
みなさん、いろいろありがとうございました。
また何かあったら質問させて頂きます。