为什么 FindFirstFile 函数不接受我指向数据结构的指针?

Why won't the FindFirstFile function accept my pointer to a data struct?

亲爱的 Stack Overflow 社区。

我是第一次来这里 post。我发现这个论坛在过去非常有帮助,并希望将来能以多种方式做出贡献。现在我有一个问题,我无法辨认出头或尾。

我正在尝试使用 FindFirstFileA、FindNextFileA 和 CloseFind 函数获取特定目录中的文件名。我正在 Microsoft Visual Studio 2017 中编写 C++ 代码并使用 UNICODE。

我选择了 "A" 后缀版本而不是 "regular" 版本,因为我发现使用 LPCWSTR 很麻烦。

我目前相关功能的代码如下所示:

void MainLoop::FindFiles(std::string Directory)
{
    Directory = Directory + "*";
    LPCSTR Path = Directory.c_str();
    LPWIN32_FIND_DATAA FileData;
    HANDLE hFind;
    hFind = FindFirstFileA(Path, FileData);
    while (FindNextFileA(hFind, FileData) != 0)
    {
        Files.push_back(FileData->cFileName);
    }
    FindClose(hFind);
}

这段代码有一个 "weird" 问题,还有一个错误使我无法编译。

"weird" 事情:

在我能找到的所有 FindFirstFile 函数的所有文档和示例中 它说第二个参数应该是一个指针,因此我的代码实际上应该是这样的: hFind = FindFirstFileA(Path, &FileData); 但是当我尝试这样做时,编译器告诉我 LPWIN32_FIND_DATAA* 与 LPWIN32_FIND_DATAA 不兼容。我不知道那里发生了什么,所以对它的一些了解将不胜感激。

实际错误与此无关,但是:

当我尝试 运行 程序时,收到一条错误消息,指出 "FileData" 未初始化并且 然后拒绝运行。在我见过的所有示例中,数据结构的声明都和我一样。没有论坛 posts 我可以找到解决我的特殊问题。 现在,我知道我只 post 编辑了一个特定的功能,如果您需要了解更多我的设置,我很乐意为您提供帮助。任何对我的问题的见解或对我的 post 或我的代码是受欢迎的。

恭敬

尼克拉斯·比约克罗斯

LPWIN32_FIND_DATAA 已经 指针 - LP 前缀代表 "long pointer"(16 位时代的遗物)。

您想将变量声明为 WIN32_FIND_DATAA 并传递指向该变量的指针。

这是一个未初始化的指针:

LPWIN32_FIND_DATAA FileData;

LPWIN32_FIND_DATAAWIN32_FIND_DATAA*.

的类型定义

您需要的是结构的实际实例,例如

WIN32_FIND_DATAA FileData;

注意 LP 从类型的开头消失了。

然后当你将它的地址传递给函数时,指针类型将匹配。

hFind = FindFirstFileA(Path, &FileData);