3

CComboBox::Dir(DDL_READWRITE, path) を使用してコンボボックスの内容を設定しています。すべて問題ありませんが、Archive フラグをリセットして Index フラグを設定すると、Dir() はファイルを返しません。私は使っている

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

私がリストしているディレクトリに。最初のパラメーターを Dir() 関数に変更しようとしましたが、役に立ちません。FindFirstFile()/FindNextFile() を試してみましたが、正常に動作しています

この動作の理由を説明するアイデアはありますか? これは Dir() 関数のバグでしょうか? はいの場合、他にどのような機能に影響を与えることができますか? この問題を解決するには?

4

1 に答える 1

0

これは非常に興味深い問題です。Win 7 64 ビットで comctl32.dllListBox_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 のエントリで、設定されないように attr が変更されるためFILE_ATTRIBUTE_NOT_CONTENT_INDEXED、ループ内の if が true になることはなく、ファイル名がコントロールに追加されることはありません。

申し訳ありませんが、私が見る限り、MS のバグ修正を待つか、自分で作業を行う必要があります。

于 2012-01-04T18:19:29.013 に答える