Проблема с FindFirstFileW - как преобразовать LPWIN32_FIND_DATA * в LPWIN32_FIND_DATAW - PullRequest
0 голосов
/ 05 мая 2020

Я реализовал следующую функцию для отображения содержимого каталога, но когда я компилирую и связываю программу, компилятор выдает мне следующие две ошибки:

ошибка C2664: 'HANDLE FindFirstFileW (LPCWSTR, LPWIN32_FIND_DATAW) ': невозможно преобразовать аргумент 2 из' LPWIN32_FIND_DATA * 'в' LPWIN32_FIND_DATAW '

ошибка C2664:' BOOL FindNextFileW (HANDLE, LPWIN32_FIND_DATA2 аргумент ': невозможно преобразовать LPWIN32_FIND_DATA_DATA в аргумент 2 LPWIN32_FIND_DATAW '

Как исправить этот код для работы с форматом Unicode:

bool FmListDirectoryContents(LPWSTR arg_path_dir)
{
    LPWIN32_FIND_DATA wfd_Data;
    wchar_t c_Path[2048];

    wprintf(c_Path, "%s\\*", arg_path_dir);

    HANDLE h_Find = FindFirstFileW(c_Path, &wfd_Data);

    if (h_Find != INVALID_HANDLE_VALUE) {
        PrintColorful(5, L"\n\t%s\t\t\t%s", "-----------", "-----------");
        PrintColorful(5, L"\n\t%s\t\t\t%s", "File Size", "File Name");
        PrintColorful(5, L"\n\t%s\t\t\t%s\n", "-----------", "-----------");

        do {
            ULONGLONG FileSize = wfd_Data->nFileSizeHigh;
            FileSize <<= sizeof(wfd_Data->nFileSizeHigh) * 8;
            FileSize |= wfd_Data->nFileSizeLow;
            printf("\n\t%llu\t\t\t\t%s", FileSize, wfd_Data->cFileName);
        } while (FindNextFileW(h_Find, &wfd_Data));

        printf("\n\n");
        FindClose(h_Find);
    }

    return true;
}

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы выбираете, что укажете использовать Unicode API вручную, поэтому вы должны использовать LPWIN32_FIND_DATAW (с явным суффиксом W) вместо LPWIN32_FIND_DATA.

Кроме того, второй аргумент FindFirstFileW и FindNextFileW имеют тип LPWIN32_FIND_DATAW, поэтому передавать указатель на LPWIN32_FIND_DATAW неправильно. LPWIN32_FIND_DATAW уже является указателем на WIN32_FIND_DATAW, поэтому вам необходимо выделить переменную с типом WIN32_FIND_DATAW и передать на нее указатель.

ссылки:

1 голос
/ 05 мая 2020

Вы передаете FindFirstFileW() и FindNextFileW() указатель на указатель на WIN32_FIND_DATA, но это не то, что они ожидают, отсюда и ошибки компилятора. Вместо этого им нужен указатель на WIN32_FIND_DATAW.

Вы также неправильно используете printf() и wprintf().

Попробуйте следующее:

bool FmListDirectoryContents(LPWSTR arg_path_dir)
{
    WIN32_FIND_DATAW wfd_Data; // <-- not LPWIN32_FIND_DATA!
    wchar_t c_Path[2048];

    swprintf(c_Path, L"%s\\*", arg_path_dir); // <-- not wprintf!

    HANDLE h_Find = FindFirstFileW(c_Path, &wfd_Data);

    if (h_Find != INVALID_HANDLE_VALUE) {
        PrintColorful(5, L"\n\t%s\t\t\t%s", "-----------", "-----------");
        PrintColorful(5, L"\n\t%s\t\t\t%s", "File Size", "File Name");
        PrintColorful(5, L"\n\t%s\t\t\t%s\n", "-----------", "-----------");

        do {
            ULARGE_INTEGER FileSize;
            FileSize.HighPart = wfd_Data->nFileSizeHigh;
            FileSize.LowPart = wfd_Data->nFileSizeLow;
            wprintf(L"\n\t%llu\t\t\t\t%s", FileSize.QuadPart, wfd_Data->cFileName); // <-- not printf!
        }
        while (FindNextFileW(h_Find, &wfd_Data));

        FindClose(h_Find);
        wprintf(L"\n\n");
    }

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