3

首先,我对宽字符串和 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 字符集进行编译。FindFirstFile当 FindFirstFileA 和 FindFirstFileW 的输入似乎是两种完全不同的类型时,我不明白期待什么类型。

所以这是我的问题:预期的输入类型是FindFirstFile什么?

推论:如何获取类型的文件名const char*并将其放入 FindFirstType 将接受的形式?

4

2 回答 2

8

FindFirstFile 是一个宏定义如下:

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

这意味着它在使用定义W编译时扩展为带有 a 的那个,而在其他情况下它扩展为带有 a 的那个。UNICODEA

现在,FindFirstFile的第一个参数是LPCSTRor LPWCSTRLPCSTR是一个 typedef for const char*whileLPWCSTR是一个 typedef for const wchar_t*。在您的错误消息中,您尝试传递一个类型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此处显示的许多选项。另一种选择是FindFirstFileA直接调用,但如果你在 Windows 上,通常最好先使用wchar_t它。

于 2013-07-08T20:18:07.810 回答
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* 字符串。

于 2013-07-08T20:17:29.657 回答