FindFirstFile的预期输入类型是什么?

Phl*_*ous 3 c++ unicode qt visual-studio-2010

我首先要说的是我基本上不了解宽字符串和Unicode支持.我让QString和QFile在99%的时间内为我处理这个问题,但我正在尝试编译为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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jes*_*ood 8

FindFirstFile是一个定义如下的宏:

#ifdef UNICODE
#define FindFirstFile  FindFirstFileW
#else
#define FindFirstFile  FindFirstFileA
#endif // !UNICODE
Run Code Online (Sandbox Code Playgroud)

这意味着它扩展为W使用已UNICODE定义编译的时间,并且扩展为具有A其他方式的那个.

现在,FindFirstFile第一个参数是LPCSTR或者LPWCSTR.LPCSTR是typedef for const char*while LPWCSTR是一个typedef const wchar_t*.在您的错误消息中,您尝试传递一种类型const char*作为第一个参数,FindFirstFileW其中接受类型的参数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);
Run Code Online (Sandbox Code Playgroud)

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

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