我目前正在Qt Creator中使用MingW32 G ++编译器。
我已经将CodeBlocks中的工作代码移植到Qt中,所以我可以使用Qt的网络功能,但是当我移植代码时,它无法编译错误:
C:\software\Qt\AutoUpload\main.cpp:90: error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'LPCWSTR {aka const wchar_t*}' for argument '1' to 'void* FindFirstFileW(LPCWSTR, LPWIN32_FIND_DATAW)'
HANDLE handle = FindFirstFile(dir, &search_data);
产生此错误的代码是第8行:
1 vector<string> getFilesInDir(string directory)
2 {
3 vector<string> filenames;
4 string dir = string(directory + "\\*");
5
6 WIN32_FIND_DATA search_data;
7 memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
8 HANDLE handle = FindFirstFile(dir.c_str(), &search_data);
9 while (handle != INVALID_HANDLE_VALUE)
10 {
11 if (FindNextFile(handle, &search_data) == FALSE) break;
12 if (search_data.cFileName == string(".") || search_data.cFileName == string(".."))
13 {
14 cout << "Ignoring..." << endl;
15 continue;
16 }
17 filenames.push_back(search_data.cFileName);
18 cout << search_data.cFileName << endl;
19 }
20
21 FindClose(handle);
22 return filenames;
23 }
其他问题,例如找到的问题here和here表明这是Windows API与LPCWSTR
类型一起使用的Unicode编码的一些问题,但此答案要么不完整,要么不正确。 CodeBlocks和Qt Creator的编码设置是UTF-8,而不是Unicode或任何其他编码方法。
如果这是一个Unicode问题,这个代码不已经在Visual Studio或CodeBlocks中编译,但它是无关紧要的。在Qt。
中, ONLY 环境无法完全编译Qt Creator在做什么突然使这段代码失效?
答案 0 :(得分:3)
在Windows API中使用字符串的所有函数实际上都是宏。
如果您查看this FindFirstFile
reference的底部,您会看到有两个功能,FindFirstFileW
和FindFirstFileA
。使用哪一个取决于UNICODE
宏,如果未定义ANSI函数(FindFirstFileA
),则使用宽字符版本(FindFirstFileW
)被使用。
如果定义了UNICODE
,则需要使用例如std::wstring
的宽字符版本。字符串类,BigQueryIO.Write
。