この問題と 1 日半戦っていますが、答えが見つかりません。保存ダイアログを開くためのコードを次の単純なコードに減らしました。
CFileDialog dlg( FALSE, _T("xml"), _T("zzz.xml"),
OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR,
_T("XML Files|*.xml||"), this);
dlg.m_ofn.lpstrInitialDir = ... a string for the initial directory
dlg.DoModal();
CFileDialog クラス (これも GetSaveFileName を直接使用するだけで検証済み) は、選択されたディレクトリへのハンドルを保持していますが、これは明らかに Windows XP (私たちの展開プラットフォーム) でのみです。これにより、アプリケーションの実行中にディレクトリの名前を変更できなくなります。
現在のディレクトリを設定する CFileDialog について誰かが話し始める前に、私はそれについて知っており、OFN_NOCHANGEDIR について知っています。これはその問題ではありません。
このコードをループで実行すると、保持されるハンドルの数が増加し、Process Explorer を使用してアプリケーションがそのディレクトリへのハンドルを持っていることを確認できます。ダイアログを繰り返し実行すると、追加のハンドルが発生しますが、常にではありません。毎回名前を変更すると、100%一貫してではありませんが、毎回新しい名前が追加されるようです。
それを回避する何かがあると思うたびに、うまくいきません。ファイル ダイアログのような基本的なものが、どうしてこんなに壊れているのでしょうか?
他に何をすべきかわかりません。これは、新しいバージョンをリリースする直前に発見された問題です。