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
。
另外,FindFirstFileW
和FindNextFileW
的第二个参数是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”的主要内容,如果未能解决你的问题,请参考以下文章