プロパティシート内から呼ばれるファイルコモンダイアログのエラーについて

解決


むー  2009-08-07 16:57:51  No: 70773

むーと申します。
度々お世話になっております。

以前,下記のスレッドで入れ子構造プロパティシートからカラーダイアログを呼び出す方法について質問したものです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200906/09060023.txt

同じ環境でCFileDialogを使ってファイルダイアログを呼び出しましたところ,問題なく呼び出すことはできるのですが,ファイルを選択して閉じた後
もう一度そのダイアログを開くとアプリケーション自体が何もエラーを吐かずに強制終了します。

ここで,ファイルを選択するまでの一連の手順は以下の以下に示すとおりです。
1.メインウィンドウ起動
2.メインウィンドウのトップメニューからモーダルダイアログ(MD)起動
3.MD内には一つのタブを3う持ったプロパティシート(PS1)が表示されており,そのうちの一つのタブをクリックするとその中にまた新たに3つのタブを持ったプロパティシート(PS2)が表示される。
4.PS2内のタブ1を選択し,そのタブ上のボタンを押す。
5.ファイルダイアログが表示される。
6.ファイルを選択し,ファイルダイアログ上の「開く」ボタンを押し,ファイルダイアログを閉じる。
7.MDを閉じる。

上記の1〜7を実行したあと,再び2を実行しようとするとアプリが強制終了されます。また,3のPS1内でファイルダイアログを呼び出しても同じです。
結局のところ,MD内のどのPSから呼び出しても強制終了するようです。
なお,過去ログで, Acrobat Reader7.0が影響しているというログを発見しました。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200902/09020029.txt
しかし,僕の環境では9.0でした。念のため案インストールしましたが,症状は変わりません。また,この過去ログの場合,ファイルダイアログに表示されているファイルにマウスカーソルを当てたとき終了するとされていますが,根本的に僕の場合とはケースが違うように思います。

このエラーの対処法についてご教授願えれば幸いです。
以上,よろしくお願いいたします。

環境
 ・VC++6.0 (MFC)
 ・Windows XP


瀬戸っぷ  2009-08-08 08:51:50  No: 70774

CFileDialogはカレントディレクトリを変更しますが、その辺りに依存した操作をしていたりしませんか?
# フラグ指定でカレントディレクトリを移動しないようにもできたと思いますが。

2回目のCFileDialogの呼び出し辺りにブレークポイント置いてステップ実行で追ってみてはどうでしょうか。


むー  2009-08-10 19:49:10  No: 70775

瀬戸っぷ様

仰るとおりディレクトリパス関連の問題でしたm(_ _)m

[改善前]
上記の一連の手続きの中で,ステップ2,6に原因があったようです。

2.メインウィンドウのトップメニューからモーダルダイアログ(MD)起動
    2.1 - 環境ファイルが読み込まれる。
          環境ファイルのパスはGetCurrentDirectoryで取得される。
          取得されるパスは実行ファイルのあるフォルダ。    

6.ファイルを選択し,ファイルダイアログ上の「開く」ボタンを押し,ファイルダイアログを閉じる。

    6.1 - ファイル選択時にカレントディレクトリが実行ファイルのある
          フォルダのサブフォルダへ移動される。

この状態で,再度MDを表示すると,ステップ2で環境ファイルを読み込む際に移動されたサブフォルダを参照することになるようです。そのため,ここでエラーが起き,強制終了しまったようです。

[改善後]
ステップ1の段階で実行ファイルのパスを取得し,以降このパスが格納されている変数を参照するように改良。

本当に助かりました。ご助力頂きましてありがとうございました^-^
これで解決とさせて頂きます。


aetos  2009-08-10 21:54:59  No: 70776

> 取得されるパスは実行ファイルのあるフォルダ。    

そもそも、この認識が間違いです。
アプリ起動直後であっても、カレントディレクトリと実行ファイルのあるフォルダは違う場合があります。

あと、OFN_NOCHANGEDIR フラグをセットすれば、カレントディレクトリを戻すことができます。
これは、ダイアログを閉じた時点でカレントディレクトリを元に戻すものであって、ダイアログを開いている間はカレントディレクトリが変更される点には注意してください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加