FindFirstFileW 问题 - 如何将“LPWIN32_FIND_DATA *”转换为“LPWIN32_FIND_DATAW”

Posted

技术标签:

【中文标题】FindFirstFileW 问题 - 如何将“LPWIN32_FIND_DATA *”转换为“LPWIN32_FIND_DATAW”【英文标题】:FindFirstFileW Issue - How to Convert 'LPWIN32_FIND_DATA *' to 'LPWIN32_FIND_DATAW' 【发布时间】:2020-05-05 18:21:32 【问题描述】:

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

错误 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”

如何修复此代码以使用 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;

【问题讨论】:

LPWIN32_FIND_DATA -> LPWIN32_FIND_DATAW%s -> `` -> %ls 非常常见的错误。你看到你需要传递一个指针,所以你声明了一个指针。这就是错误。您必须改为声明一个对象,然后传递该对象的地址。 【参考方案1】:

您选择手动指定使用 Unicode API,因此您必须使用LPWIN32_FIND_DATAW(带有显式后缀W)而不是LPWIN32_FIND_DATA

另外,FindFirstFileWFindNextFileW 的第二个参数是LPWIN32_FIND_DATAW 类型,所以传递一个指向LPWIN32_FIND_DATAW 的指针是错误的。 LPWIN32_FIND_DATAW 已经是一个指向 WIN32_FIND_DATAW 的指针,所以你必须分配一个类型为 WIN32_FIND_DATAW 的变量并传递一个指向它的指针。

参考:

WIN32_FIND_DATAW (minwinbase.h) - Win32 apps | Microsoft Docs FindFirstFileW function (fileapi.h) - Win32 apps | Microsoft Docs FindNextFileW function (fileapi.h) - Win32 apps | Microsoft Docs

【讨论】:

顺便说一句,我宁愿使用WIN32_FIND_DATA *wfd_Data 而不是LPWIN32_FIND_DATA wfd_Data,这样你就不太可能搞砸了。 确实,LP 前缀是 “长指针” 的缩写。长指针和近指针之间的区别在 16 位 Windows 中是相关的。今天,在平面内存模型中,指针只是一个指针。有关更多信息,请参阅pointer types。【参考方案2】:

您正在传递 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;

【讨论】:

以上是关于FindFirstFileW 问题 - 如何将“LPWIN32_FIND_DATA *”转换为“LPWIN32_FIND_DATAW”的主要内容,如果未能解决你的问题,请参考以下文章

我如何将 openMP 用于我的代码?

如何将元素添加到R中的列表(循环)[重复]

如何在matlab中将L*a*b*转换为灰度

如何更改 Pandas Dataframe 的形状(带有“L”的行号)?

我将如何将这些多个连接作为 Django 查询集进行?

如何找到[L,R]之间大小的最大和子数组