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

时间:2013-07-08 19:58:19

标签: c++ visual-studio-2010 qt unicode

我首先要说的是我基本上不了解宽字符串和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将接受的表单中?

2 个答案:

答案 0 :(得分:7)

FindFirstFile是一个定义如下的宏:

#ifdef UNICODE
#define FindFirstFile  FindFirstFileW
#else
#define FindFirstFile  FindFirstFileA
#endif // !UNICODE

这意味着,当使用W进行编译时,它会扩展为UNICODE的那个,否则会扩展为A

现在,FindFirstFile的第一个参数是LPCSTRLPWCSTRLPCSTRconst char*的typedef,而LPWCSTRconst 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));。否则,您需要使用MultiByteToWideCharmany 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 *字符串。