ファイルを複数選択したい – プログラミング – Home

ファイルを複数選択したい
 
通知
すべてクリア

[解決済] ファイルを複数選択したい


ふぁいん
 ふぁいん
(@ふぁいん)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

環境: 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()) );


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

漢字やカナを含んでいるとき、
file_name1,2,3 にはちゃんとした文字列が入ってきてますか?


返信引用
ふぁいん
 ふぁいん
(@ふぁいん)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

お返事ありがとうございます。

漢字やカナを含んでいる時も、きちんと文字列は入ってきています。


返信引用
アキラ
 アキラ
(@アキラ)
ゲスト
結合: 23年前
投稿: 49
 

>固まる箇所は、ダイアログボックスでファイルを選択して、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())


返信引用
アキラ
 アキラ
(@アキラ)
ゲスト
結合: 23年前
投稿: 49
 

誤字訂正

>それ、これは
それと、これは


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> charをTCHARに変えて、strcpy_sを_tcscpy_sに変えるとうまくいくかもしれません。

この場合、_tcscpy_sの第二引数sizeof(file_name1)をsizeof(file_name1)/sizeof
(file_name1[0])またはMAX_PATHに変えておくことをお忘れなく。


返信引用
ふぁいん
 ふぁいん
(@ふぁいん)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

アキラさん、maruさん、お返事ありがとうございます。

固まるダイアログボックスは、不定です。
1つ目で固まる時もありますし、2つ目の時もあります。

また、VC++2005の設定は、マルチバイト文字を使うようにしてあります。
キャストのやり方を直して試してみます。

------------------------------------------------------------------------
関係ないお話になるかも知れませんが、パソコンの調子が悪いようです。(T_T)
何もプログラムを起動してない状態でも、CPUの使用率が50~100%、
メモリ使用量も通常の2倍以上になり、フル稼動状態になったりで不安定です。
今回、固まるのは、もしかしたらこれが原因かな?って思いました。

システムの復元でも安定しないので、OSを修復インストールするつもりです。
もしかしたら、これで直るかも知れません。結果はまたご連絡致します。


返信引用
似たようなことが
 似たようなことが
(@似たようなことが)
ゲスト
結合: 17年前
投稿: 1
 

CFileDialogを使用するとAdobeReaderが違反を起こして止まるみたいです。
ひょっとしたらこれが原因かも。私はこれが原因でした;;

参考
ttp://blog.so-net.ne.jp/cadse/2007-03-02


返信引用
ふぁいん
 ふぁいん
(@ふぁいん)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

ご連絡が遅くなり申し訳ありません。(延々と悩み続けてました;;;)

似たようなことが さん
 お返事ありがとうございます。
 Adobe Reader7が違反して件については、他のサイトで読みましたが、
 教えて頂いたサイトも見てみます。

アキラさん、maruさん
 教えて頂いた通りにやってみましたが、結果は変わりませんでした。
 でも、今後は教えて頂いた内容でコーディングします。
 大変勉強になりました。

>ファイル選択ダイアログを3回表示されて、ファイル名を取得したいのですが、
>時々途中で固まってしまいます
私が最初に書いた内容は少し間違っていました。正確には「固まる」ではなくて
「動作が遅くなる?」でした。そのままにしておくと、忘れた頃に動き出します。

PC自体の調子も悪いので、OSを再インストールしましたが、
結果は変わりませんでした。
試しに実行ファイルを別のPCで起動させてみたら、問題なく動きました。
何が原因が分かりませんが、問題は別のところにあるのかも知れません。

ファイル選択とは関係ないかも知れませんので、これで解決としておきます。
みなさん、いろいろありがとうございました。
また何かあったら質問させて頂きます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました