Почему функция FindFirstFile не принимает мой указатель на структуру данных? - PullRequest
0 голосов
/ 20 апреля 2020

Уважаемое сообщество переполнения стека.

Я здесь впервые. Я нашел этот форум очень полезным в прошлом и надеюсь внести свой вклад во многих отношениях в будущем. Сейчас у меня есть проблема, с которой я не могу разобрать голову или хвост.

Я пытаюсь получить имена файлов в указанном каталоге c, используя функции FindFirstFileA, FindNextFileA и CloseFind. Я пишу код C ++ в Microsoft Visual Studio 2017 и использую UNICODE.

Я выбрал версию с суффиксом «А», а не «обычную», потому что работа с 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);
}

В этом коде есть одна «странная» вещь и одна ошибка, которая не позволяет мне компилироваться.

«странная» вещь:

Во всей документации и примерах, которые я могу найти во всех функциях FindFirstFile, говорится, что второй параметр должен быть указателем, и, таким образом, мой код должен выглядеть так: this: hFind = FindFirstFileA (Path, & FileData); Но когда я пытаюсь это сделать, компилятор говорит мне, что LPWIN32_FIND_DATAA * не совместим с LPWIN32_FIND_DATAA. Я не знаю, что там происходит, поэтому я бы оценил некоторый свет.

Фактическая ошибка не касается этого, однако:

Когда я пытаюсь запустить программу, мне выдается сообщение об ошибке, в котором говорится, что «FileData» не инициализирован, а затем отказывается запускаться. Во всех примерах, которые я видел, структура данных объявляется так же, как и я. Нет сообщений на форуме, которые я могу найти для решения моих конкретных проблем Теперь я знаю, что я опубликовал только определенную c функцию, и если вам нужно узнать больше о моей настройке, я буду рад вас заполнить. Любое понимание моей проблемы или конструктивные комментарии либо к моему посту, либо к моему код приветствуется.

С уважением

Никлас Бьоркерот

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Это неинициализированный указатель:

LPWIN32_FIND_DATAA FileData;

LPWIN32_FIND_DATAA - это typedef для WIN32_FIND_DATAA*.

Вам нужен фактический экземпляр структуры, например

WIN32_FIND_DATAA FileData;

Обратите внимание, что LP отсутствует с начала типа.

Затем, когда вы передадите его адрес функции, тип указателя будет совпадать.

hFind = FindFirstFileA(Path, &FileData);
1 голос
/ 20 апреля 2020

LPWIN32_FIND_DATAA уже является указателем - префикс LP означает «длинный указатель» (reli c 16-битной эры).

Вы хотите объявить переменная как WIN32_FIND_DATAA и передать указатель на нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...