質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

7401閲覧

[MFC]ファイル保存ダイアログでのエラー回避方法

kobayou082

総合スコア7

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/05/29 08:56

編集2016/05/30 13:05

MFCでのプログラミングに関する質問です。

以下の動作を実現させるプログラムを作成しました。

  1. ダイアログにある参照ボタンをクリックする。
  2. ファイル保存ダイアログを表示し、任意の場所及びファイル名を指定し、保存ボタンをクリックする。
  3. 1のダイアログにあるテキストボックスに、指定したファイルのパスを表示させる。

動作は基本的には問題ないのですが、以下のような問題が発生しています。

(1)上記の2で、ファイルのパスをライブラリに指定して保存ボタンをクリックすると、プログラムが強制終了する。
(2)上記の2で、ファイルのパスをライブラリ下のフォルダ(ドキュメント、ピクチャ等)に指定して保存ボタンをクリックすると、テキストボックスにファイル名しか表示されない。

なお、ライブラリやドキュメントなどに作成したフォルダを指定した場合は、動作に問題はありませんでした。

上記の(1)(2)のエラーを回避したいのですが、現状回避方法が定まらず、困っています。
理由として、(1)はデバッグをかけても自作のソースコード内でなく、MFCのプロジェクトで標準であるソースファイルでストップしたためです。
(2)はそもそもデバッグで停止しないので、原因が掴めないためです。

上記(1)(2)のエラーを回避し、ファイル保存ダイアログで指定したファイルパスを表示する方法、または強制終了せずにエラーメッセージを表示する方法がありましたら、ご教授願います。

使用OSはWin7 x86、開発環境はVisual Studio2010 です。

5/30 追記
str1~str4には、多言語対応のため、リソースビューのString Tableで文字列を定義し、そのコードを入力しています。
それぞれで定義している文字列は以下の通りです。

str1: abc
str2: ABC2sABC
str3: ABCファイル (.abc)|.abc||
str4: エクスポート先指定

また、それに伴い、一部簡略化して掲載していたソースコードを、簡略化なしで掲示しました。

###作成したソースコード

void MainWindow::OnBClickedmainwindowpathselect() { CFileDialog dlg(FALSE, str1, str2, OFN_OVERWRITEPROMPT, str3); dlg.m_ofn. lpstrTitle = str4; if(dlg.Domodal() == IDOK){ mainWindowPathInput_default = dlg. GetFolderPath() + _T("\\") + dlg .GetFileName(); UpdateData(FALSE); } }

###ソースコード再掲載(5/30)

void MainWindow::OnBClickedmainwindowpathselect() { //登録コード1-4はString Tableで登録したコードを指しています。 CString str1, str2, str3, str4; str1 = LoadString(登録コード1); str2 = LoadString(登録コード2); str3 = LoadString(登録コード3); str4 = LoadString(登録コード4); CFileDialog dlg(FALSE, str1, str2, OFN_OVERWRITEPROMPT, str3); dlg.m_ofn. lpstrTitle = str4; if(dlg.Domodal() == IDOK){ mainWindowPathInput_default = dlg. GetPathName(); UpdateData(FALSE); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2016/05/29 14:50

str1からstt4にどんな文字列が入っているかを提示してください。そこに強制終了の原因があるのではないかと思います。
guest

回答3

0

皆様、回答ありがとうございました。

OPENFILENAME 構造体とGetSaveFileName 関数を使用してダイアログを呼び出す方式で試してみたところ、強制終了が出なくなったため、解決とさせていただきます。

投稿2016/05/31 13:44

kobayou082

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

catsforepaw

2016/05/31 14:16

Windows API直呼び出しなら大丈夫ということはMFCのバグですかね。だとすればVisual Studioの現行バージョンでは直っているかもしれません。
guest

0

ベストアンサー

強制終了については、手元の環境では再現しなかったのでよく判りません。「ここには保存できません」というメッセージボックスが出るだけです。str1~4に何が設定されているのかが判らないのでなんとも言えませんが、未設定(デフォルト値)で実行しても強制終了するでしょうか?

mainWindowPathInput_default = dlg. GetFolderPath() + _T("\") + dlg .GetFileName();

Windows7で軽く試してみましたが、(2)は再現しました。GetFolderPathメソッドは「ドキュメント」の実際のパス文字列を返してくれないようです。

ファイルのフルパスを取得する際は、フォルダー名とファイル名を別々に取得するのではなく、GetPathNameメソッドを使う方が良いかと思います。これだと必ず正しいパス名が取得できます。

投稿2016/05/29 13:56

編集2016/05/29 14:08
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kobayou082

2016/05/30 13:08

回答ありがとうございます。 (2)について、提示してくださった内容で解決いたしました。ありがとうございます。 (1)については、情報を質問文に追記しました。また、str1~4を_T("")にして、ライブラリでファイル保存を試してみましたが、やはり強制終了エラーが出ました。
catsforepaw

2016/05/30 13:45

ということは、引数で渡した文字列が何か問題を起こしたというわけではなさそうですね。 なかなか難問です。 すみません、すぐには思いつきません。
guest

0

1.アクセス権の問題が無いかどうか。
2.「windows 特殊フォルダ」で検索出来る事柄に該当しないかどうか。
3.Vista 以後では、「windows シンボリックリンク ジャンクション ハードリンク」
で、検索できる事柄に該当しないかどうか。
確認してみてください。

投稿2016/05/29 09:27

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kobayou082

2016/05/30 13:06

回答ありがとうございます。 まだ解決方法は見つかっていませんが、引き続き上のキーワードで調査を続けてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問