我一直在与这个问题作斗争一天半,但找不到答案。我已将代码简化为用于打开保存对话框的简单代码:
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% 始终如一。
每次我认为我有一些可以解决它的东西时,它都不会成功。像文件对话框这样的基本东西怎么会被破坏?
我不知道还能做什么。这是在我们即将发布新版本之前发现的一个问题。