我首先要说的是我基本上不了解宽字符串和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
代码正在使用FindFirstFile
函数,该函数是重载的(取决于您是否使用Unicode字符集进行编译)。当FindFirstFileA和FindFirstFileW的输入似乎是两种完全不同的类型时,我不明白FindFirstFile
期望什么类型。
所以这是我的问题:FindFirstFile
的预期输入类型是什么?
推论:我如何获取const char*
类型的文件名并将其放入FindFirstType将接受的表单中?
答案 0 :(得分:7)
FindFirstFile是一个定义如下的宏:
#ifdef UNICODE
#define FindFirstFile FindFirstFileW
#else
#define FindFirstFile FindFirstFileA
#endif // !UNICODE
这意味着,当使用W
进行编译时,它会扩展为UNICODE
的那个,否则会扩展为A
。
现在,FindFirstFile
的第一个参数是LPCSTR
或LPWCSTR
。 LPCSTR
是const char*
的typedef,而LPWCSTR
是const wchar_t*
的typedef。在您的错误消息中,您尝试将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);
如何获取const char *类型的文件名并将其放入表单中 FindFirstType会接受吗?
如果您的文件名只包含基本ASCII字符集中的字符,则可以将其转换为std::wstring
,如下所示:std::wstring path(std::begin(filename), std::end(filename));
。否则,您需要使用MultiByteToWideChar或many of the options shown here。另一个选择是直接拨打FindFirstFileA
,但如果你在Windows上,通常最好先使用wchar_t
。
答案 1 :(得分:0)
如果要编译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 *字符串。