C++ FindFirstFile的预期输入类型是什么?
首先,我要说我对宽字符串和Unicode支持基本一无所知。99%的时间我都让QString和QFile来处理,但我正在尝试编译其他人为VC6编写的库 在Qt Creator中使用MSVC2010进行编译时,出现以下错误:C++ FindFirstFile的预期输入类型是什么?,c++,visual-studio-2010,qt,unicode,C++,Visual Studio 2010,Qt,Unicode,首先,我要说我对宽字符串和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 req
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可以接受的格式?如果您是为unicode编译,则预期的输入类型为const wchar\u t*。(你是谁:“W”告诉我们。)。如果不是为unicode编译,则预期输入类型为const char*。在解决问题之前,您必须决定是否为unicode编译。如果选择unicode,那么字符串应该是wchar_t*或std::wstring或CString。这会让你的问题消失
如果您确实需要在unicode编译的应用程序中使用const char*,则必须通过调用MultiByteToWideChar API函数将const char*转换为const wchar\u t*字符串。FindFirstFile是一个定义如下的宏:
#ifdef UNICODE
#define FindFirstFile FindFirstFileW
#else
#define FindFirstFile FindFirstFileA
#endif // !UNICODE
这意味着,当使用定义的UNICODE
编译时,它将扩展到具有W
的代码,否则它将扩展到具有a
的代码
现在,FindFirstFile
的第一个参数是LPCSTR
或LPWCSTR
LPCSTR
是const char*
的类型定义,而LPWCSTR
是const wchar*
的类型定义。在错误消息中,您尝试将一种类型的const char*
作为第一个参数传递给FindFirstFileW
,该参数采用类型为const wchar*
的参数,因此出现错误
为了使类型匹配,您需要传递类型为const wchar\u 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路径(std::begin(文件名),std::end(文件名))代码>。否则,您将需要使用或。另一种选择是直接调用FindFirstFileA
,但如果您在windows上,通常最好首先使用wchar\u t
。这不是重载。这是一个宏,用于从两个不同命名的函数中选择一个。C没有重载。好的,我将改变措辞以反映这一点。仅供参考,我对函数的输入是一个字符数组,而不是字符串文字,因此在L
上加上标记没有帮助。如果在编译时需要使用UNICODE
预处理器符号(可能不需要),请将调用替换为FindFirstFile(_t(“arg_0”),…)
。否则,将调用替换为FindFirstFileW(L“arg_0”,…)
。要回答您的问题,如果您正在调用FindFirstFileA
,则预期参数类型为const char*
;如果您正在调用FindFirstFileW
,则预期参数类型为const char*
。提示:不要陷入TCHAR
s。从一开始就使用宽字符串,这样就不用担心了,而且可以在任何并不太旧的Windows版本中使用。@chris或在任何地方使用UTF-8,并且只在必要时转换:尽管您的建议是最实用的。