c++ - CFileDialog 在 Windows XP 下保留目录句柄

标签 c++ windows mfc

我已经和这个问题斗争了一天半了,找不到答案。我已将代码缩减为用于打开保存对话框的这一简单代码:

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% 始终如一。

每次我认为我有办法解决它时,它并没有成功。像文件对话框这样基本的东西怎么会这么坏?

我不知道还能做什么。这是我们即将发布新版本之前发现的问题。

最佳答案

考虑到 MFC 的 CFileDialog 以及底层的 Windows API 已经存在了很长时间,我的第一 react 是怀疑它们是否存在泄漏句柄如此明显的错误。所以我猜你看到的问题是由其他原因引起的。

关于文件对话框的一件事是它加载 shell 扩展。例如,您在 Windows 资源管理器中看到的各种第三方右键单击功能也将在您在自己的程序中调用的文件对话框中可用。如果 shell 扩展表现良好,那没关系,但有些则不然。因此,您测试过的系统有可能安装了编写不当的 shell 扩展,当文件对话框使用时,最终会泄漏句柄。

我以前见过文件对话框加载的这些额外组件导致软件其他部分出现问题的情况,但仅限于某些人的计算机,因为并非每个人都安装了相同的东西。

当然,我没有足够的信息说这实际上是您的问题。我只能提供想法并建议您尝试在不同的 Windows XP 计算机上测试此问题,这些计算机的设置不相似。您还可以尝试在安装其他任何东西之前在全新安装的 Windows XP 上对其进行测试。如果问题没有出现在某些计算机上,则表明问题出在某些第三方组件上。

关于c++ - CFileDialog 在 Windows XP 下保留目录句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12538341/

相关文章:

c++ - 如何使用类方法映射 MFC 工具栏按钮事件?

c++ - 输出结构的枚举返回负数

c++ - SHLoadImageFile(L"\\Program Files\\TrainingApp\\background.png");论点中的 L 是为了什么?

visual-c++ - 静态文本字体参数更改

c++ - 光电鼠标作为编码器

python - Pytest:Windows 致命异常:访问冲突

c++ - 有没有办法找出第二个事件将在 MFC 中发生

c++ - Boost Log 剪切长日志消息

c++ - 从 C++ 程序调用 Stan 例程

c++ - C++ 中的 vector 如何使用内存?