Microsoft Docs

问题描述 投票:0回答:1
FindFirstFileW function (fileapi.h) - Win32 apps

我实现了下面的函数来列出一个目录的内容,但是当我编译和链接程序时,编译器给了我以下两个错误。

错误C2664:"HANDLE FindFirstFileW(LPCWSTR,LPWIN32_FIND_DATAW)":无法将参数2从 "LPWIN32_FIND_DATA *"转换为 "LPWIN32_FIND_DATAW"。

错误C2664:"BOOL FindNextFileW(HANDLE,LPWIN32_FIND_DATAW)":无法将参数2从 "LPWIN32_FIND_DATA *"转换为 "LPWIN32_FIND_DATAW

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;
}
怎样才能把这段代码修正为能用Unicode格式工作。
c++ c winapi
1个回答
1
投票

我实现了下面的函数来列出一个目录的内容,但是当我编译和链接程序时,编译器给了我以下两个错误:错误C2664:'HANDLE ...'。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;
}
试试这个。

2
投票

LPWIN32_FIND_DATAW你选择你将手动指定使用Unicode API,所以你必须使用 WLPWIN32_FIND_DATA)而不是

.FindFirstFileW另外,第2个论点的 FindNextFileWLPWIN32_FIND_DATAW 是类型 LPWIN32_FIND_DATAW因此,将一个指针传递给 LPWIN32_FIND_DATAW.WIN32_FIND_DATAW 已经是一个指向 WIN32_FIND_DATAW所以你必须分配一个类型为

并传递一个指针给该指针。

© www.soinside.com 2019 - 2024. All rights reserved.