FindFirstFile的预期输入类型是什么

What is the expected input type of FindFirstFile?

本文关键字:类型 是什么 输入 FindFirstFile      更新时间:2023-10-16

我首先要说的是,我对宽字符串和Unicode支持基本一无所知。99%的时间我都让QString和QFile来处理,但我正在尝试编译别人为VC6编写的库。

当我在Qt Creator中使用MSVC2010编译时,我得到了以下错误:

error: C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

代码使用的是FindFirstFile函数,它是重载的(有点),这取决于您是否使用Unicode字符集进行编译。当FindFirstFileA和FindFirstFileW的输入似乎是两种完全不同的类型时,我不明白FindFirstFile期望的是什么类型。

所以我的问题是:FindFirstFile的预期输入类型是什么?

推论:如何获取类型为const char*的文件名,并将其放入FindFirstType将接受的表单中?

FindFirstFile是一个宏,定义如下:

#ifdef UNICODE
#define FindFirstFile  FindFirstFileW
#else
#define FindFirstFile  FindFirstFileA
#endif // !UNICODE

这意味着,当使用定义的UNICODE编译时,它会扩展到具有W的,否则它会扩展为具有A的。

现在,FindFirstFile的第一个参数是LPCSTRLPWCSTR。CCD_ 11是CCD_ 12的typedef,而CCD_。在错误消息中,您尝试将const char*类型作为第一个参数传递给FindFirstFileW,CCD_16接受const wchar_t*类型的参数,因此出现错误。

为了使类型匹配,您需要传递const wchar_t*类型的对象,您有几个选项:

std::wstring path1 = L"..."; // 1
const wchar_t* path2 = L"..."; // 2
wchar_t path3[] = L"..."; // 3
WIN32_FIND_DATA  w32fd;
FindFirstFile(path1.c_str(), &w32fd); // 1
FindFirstFile(path2, &w32fd); // 2
FindFirstFile(path3, &w32fd); // 3
FindFirstFile(L"...", &w32fd);

如何获取const-char*类型的文件名并将其放入表单中FindFirstType会接受吗?

如果文件名仅包含基本ASCII字符集中的字符,则可以将其转换为std::wstring,如下所示:std::wstring path(std::begin(filename), std::end(filename));。否则,您将需要使用MultiByteToWideChar或此处显示的许多选项。另一种选择是直接调用FindFirstFileA,但如果您在windows上,通常最好从wchar_t开始。

如果您是为unicode编译,则预期的输入类型为const wchar_t*。(你是什么:'W'参数告诉了我们这一点。).如果你不是为unicode编译,那么预期的输入类型是const-char*。在解决问题之前,您必须决定是否编译unicode。如果您选择unicode,那么您的字符串应该是wchar_t*或std::wstring或CString。这应该会让你的问题消失。

如果您确实需要在unicode编译的应用程序中使用const char*,则必须通过调用MultiByteToWideChar API函数将const char**转换为const wchar_t*字符串。