谁能告诉我为什么我会出错。我已经想了一段时间了。
LPCWSTR drive2[4] = { L"C:\\", L"D:\\", L"E:\\", L"F:\\" };
int i;
UINT test;
for (i = 0; i<12; i++)
{
test = GetDriveType(drive2[i]); //anything from here with "drive2[i]" is an error.
switch (test)
{
case 0: ::MessageBox(Handle, drive2[i], "0 cannot be determined", MB_OK);
break;
case 1: ::MessageBox(Handle, drive2[i], "1 invalid", MB_OK);
break;
case 2: ::MessageBox(Handle, drive2[i], "2 removable", MB_OK);
break;
case 3: ::MessageBox(Handle, drive2[i], "3 fixed", MB_OK);
break;
default: "Unknown value!\n"; 谢谢!
发布于 2020-04-15 20:33:02
LPCWSTR是const wchar_t*的别名。
您正在使用TCHAR版本的GetDriveType()和MessageBox()函数。如果在编译时定义了TCHAR,则wchar_t映射到UNICODE,否则它将映射到char。
您的drive2变量是一个wchar_t指针数组,因此为了将drive2[i]作为-传递给GetDriveType()和MessageBox(),您必须为Unicode编译项目(即在编译时定义UNICODE条件),这将使GetDriveType()映射到GetDriveTypeW(),而MessageBox()映射到MessageBoxW(),以便它们只接受宽字符串(wchar_t)。否则,GetDriveType()将映射到GetDriveTypeA(),MessageBox()将映射到MessageBoxA(),因此它们只接受窄带(char)字符串。
您正在将窄字符串文本传递给MessageBox(),它在为Unicode编译时不能工作。如果不为Unicode编译,则不能将宽字符串传递给TCHAR函数--这听起来就像您的情况一样,因为错误消息是在抱怨将const wchar_t*指针传递给const char*参数。
您需要使用TEXT()宏来使字符串文本在定义UNICODE时变宽,而不是狭窄。
我还建议将TEXT()用于drive2数组中的字符串文本,以匹配要将数组元素传递给的TCHAR函数。
而且,您的循环超出了drive2数组的范围。
说到这里,试试这个:
LPCTSTR drive2[4] = { TEXT("C:\\"), TEXT("D:\\"), TEXT("E:\\"), TEXT("F:\\") };
int i;
UINT test;
for (i = 0; i < 4; i++)
{
test = GetDriveType(drive2[i]);
switch (test)
{
case 0:
::MessageBox(Handle, drive2[i], TEXT("0 cannot be determined"), MB_OK);
break;
case 1:
::MessageBox(Handle, drive2[i], TEXT("1 invalid"), MB_OK);
break;
case 2:
::MessageBox(Handle, drive2[i], TEXT("2 removable"), MB_OK);
break;
case 3:
::MessageBox(Handle, drive2[i], TEXT("3 fixed"), MB_OK);
break;
default:
::MessageBox(Handle, drive2[i], TEXT("Unknown value!"), MB_OK);
break;
}
}否则,如果您想专门处理wchar_t (应该是这样),那么直接使用基于Unicode的函数定义,并且只使用宽字符串文字,根本不处理TCHAR:
LPCWSTR drive2[4] = { L"C:\\", L"D:\\", L"E:\\", L"F:\\" };
int i;
UINT test;
for (i = 0; i < 4; i++)
{
test = GetDriveTypeW(drive2[i]);
switch (test)
{
case 0:
::MessageBoxW(Handle, drive2[i], L"0 cannot be determined", MB_OK);
break;
case 1:
::MessageBoxW(Handle, drive2[i], L"1 invalid", MB_OK);
break;
case 2:
::MessageBoxW(Handle, drive2[i], L"2 removable", MB_OK);
break;
case 3:
::MessageBoxW(Handle, drive2[i], L"3 fixed", MB_OK);
break;
default:
::MessageBoxW(Handle, drive2[i], L"Unknown value!", MB_OK);
break;
}
}发布于 2020-04-15 19:06:51
LPCSTR是const char*,LPCWSTR是const wchar_t*,它们是不兼容的。
C++:LPCWSTR string = L"Wide string";中的宽字符串声明
正则字符串:LPCSTR string = "Regular string";
如果您想使用宽字符串,则需要使用W版本,在您的情况下,使用GetDriveTypeW。
请注意,GetDriveType不是一个函数,它是一个宏,如果您的代码是以ASCII模式编译(默认),则扩展到GetDriveTypeA,但是如果代码是以UNICODE模式编译的,则扩展到GetDriveTypeW。
https://stackoverflow.com/questions/61236614
复制相似问题