C++ 类型为“的参数”;LPCWSTR";与类型为“的参数不兼容”;LPCSTR";

C++ 类型为“的参数”;LPCWSTR";与类型为“的参数不兼容”;LPCSTR";,c++,lpcwstr,C++,Lpcwstr,谁能告诉我为什么我会出错。我一直在想这个问题 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 "

谁能告诉我为什么我会出错。我一直在想这个问题

    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";                                                    
LPCWSTR drive2[4]={L“C:\\”,L“D:\\”,L“E:\\”,L“F:\\”;
int i;
UINT试验;

对于(i=0;i
LPCSTR
const char*
,而
LPCWSTR
const wchar*
,它们不兼容

C++中的宽字符串声明:
LPCWSTR string=L“宽字符串”;

常规字符串:
LPCSTR string=“常规字符串”

如果要使用宽字符串,则需要使用
W
版本,在您的情况下,使用
GetDriveTypeW

请注意,
GetDriveType
不是一个函数,如果您的代码是在ASCII模式下编译的(默认),它是一个扩展到
GetDriveTypeA
的宏,但是如果代码是在UNICODE模式下编译的,它将扩展到
GetDriveTypeW

您正在使用
TCHAR
版本的
GetDriveType()
MessageBox()
函数。
TCHAR
映射到
wchar\t
如果在编译时定义了
UNICODE
,否则映射到
char

您的
drive2
变量是一个
wchar\u t
指针数组,因此为了像传递
drive2[i]
GetDriveType()
MessageBox()
一样传递
drivetype],您必须为Unicode编译项目(即在编译时定义
Unicode
条件),这将使
GetDriveType()
映射到和
MessageBox()
映射到,以便它们只接受宽(
wchar\t
)字符串。否则,
GetDriveType()
将映射到和
MessageBox()
将映射到,以便它们只接受窄(
char
)字符串

您正在将窄字符串文本传递给
MessageBox()
,这在为Unicode编译时不起作用。如果您不是为Unicode编译,则无法将宽字符串传递给
TCHAR
函数-在您的情况下,这听起来像是这样,因为错误消息抱怨传递指向
const char*
参数的
const wchar\u t*
指针

定义
UNICODE
时,需要使用宏使字符串文字变宽,而不是变窄

我还建议对
drive2
数组中的字符串文本使用
TEXT()
,以匹配将数组元素传递给的
TCHAR
函数

此外,您的循环超出了
drive2
数组的范围

话虽如此,请尝试以下方法:

LPCTSTR drive2[4]={TEXT(“C:\\”),TEXT(“D:\\”),TEXT(“E:\\”),TEXT(“F:\\”)};
int i;
UINT试验;
对于(i=0;i<4;i++)
{                         
测试=GetDriveType(drive2[i]);
开关(测试)
{                          
案例0:
::MessageBox(句柄,驱动器2[i],文本(“0无法确定”),MB_OK);
打破
案例1:
::MessageBox(句柄,驱动器2[i],文本(“1无效”),MB_OK);
打破
案例2:
::MessageBox(句柄,驱动器2[i],文本(“2可移动”),MB_OK);
打破
案例3:
::MessageBox(句柄,驱动器2[i],文本(“3固定”),MB_OK);
打破
违约:
::MessageBox(句柄,驱动器2[i],文本(“未知值!”),MB_OK);
打破
}
}
否则,如果您想专门处理
wchar\u t
(您应该这样做),那么直接使用基于Unicode的函数定义,并且只使用宽字符串文本,根本不处理
TCHAR

LPCWSTR drive2[4]={L“C:\\”,L“D:\\”,L“E:\\”,L“F:\\”;
int i;
UINT试验;
对于(i=0;i<4;i++)
{                         
test=GetDriveTypeW(drive2[i]);
开关(测试)
{                          
案例0:
::MessageBoxW(句柄,驱动器2[i],L“0无法确定”,MB_OK);
打破
案例1:
::MessageBoxW(句柄,驱动器2[i],L“1无效”,MB_正常);
打破
案例2:
::MessageBoxW(手柄,驱动器2[i],L“2可拆卸”,MB_正常);
打破
案例3:
::MessageBoxW(手柄,驱动器2[i],L“3固定”,MB_正常);
打破
违约:
::MessageBoxW(句柄,驱动器2[i],L“未知值!”,MB_OK);
打破
}
}

如果定义了
UNICODE
,则不需要显式使用
W
版本,并且应该为所有新项目定义它。(尽管UTF-8支持正在增加…)据我所知,它不是默认定义的。你应该在项目属性中定义它或添加相应的标志。编辑:我刚检查过,默认值仍然是多字节(ASCII),我认为显式使用W或A版本最安全,这取决于你的意图。然后你不必假设任何事情。