Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ FindFirstFile的预期输入类型是什么?_C++_Visual Studio 2010_Qt_Unicode - Fatal编程技术网

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

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

首先,我要说我对宽字符串和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可以接受的格式?

如果您是为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,并且只在必要时转换:尽管您的建议是最实用的。