winapi - 如果未设置存档属性并设置了索引属性,CComboBox::Dir 函数不会列出目录

标签 winapi visual-c++ mfc ccombobox

我正在使用 CComboBox::Dir(DDL_READWRITE, path) 来填充组合框的内容。一切都很好,但是当我重置存档标志并设置索引标志时,Dir() 不返回任何文件。我正在使用

attrib -A *.*
attrib +I *.*

在我列出的目录中。我曾尝试将第一个参数更改为 Dir() 函数,但它没有帮助。我已经尝试了 FindFirstFile()/FindNextFile(),它们工作正常

有什么想法可以解释这种行为的原因吗? 这可能是 Dir() 函数中的错误吗?如果是,它还能影响哪些其他功能? 如何解决这个问题?

最佳答案

这是一个很有趣的问题。我在 Win 7 64 位上将它调试到 comctl32.dll ListBox_DirHandler 汇编代码中,发现 Windows 正在做这样的事情(只是一些简化的代码):

// attr is the low word of the parameter passed to CComboBox::Dir.
attr &= FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL;
attr |= FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_READONLY;

WIN32_FIND_DATA finddata;
FindFirstFile(..., &finddata)
while(...) {
  if(finddata.dwFileAttributes == FILE_ATTRIBUTE_COMPRESSED)
    finddata.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
  if(finddata.dwFileAttributes & attr) {
    // some more checks and then might add the file name to the control;
  }
  FindNextFile(..., &finddata);
}

问题是您的文件返回时带有 finddata.dwFileAttributes==FILE_ATTRIBUTE_NOT_CONTENT_INDEXED。在函数的入口处更改了 attr,以便它永远不会设置 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,因此循环内的 if 永远不会为真,并且文件名永远不会添加到控件中。

抱歉,据我所知,您将不得不等待 MS 错误修复或自己完成工作。

关于winapi - 如果未设置存档属性并设置了索引属性,CComboBox::Dir 函数不会列出目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304269/

相关文章:

c++ - 将某个时间增加一天?

c++ - 如何在 C++ 中使用 fprintf 编写 UTF-8 文件

java - 如何通知用户桌面应用程序的重要事件?

c++ - 在 C++ 中使用 FillRect()

c++ - 如何初始化一个char数组?

c++ - 在 C++ 中搜索 CString

windows - 如何在dll注入(inject)中调用特定函数?

c++ - 包含自定义文件列表的资源管理器样式 ListView

c# - 有人在 .NET 中使用过 Win32 API 函数 CredWrite 吗?

c++ - 未解析的外部符号 “std::basic_string”