繁体   English   中英

“LPCWSTR”类型的参数与“LPCSTR”类型的参数不兼容

[英]Argument of type “LPCWSTR” is incompatible of the parameter of type “LPCSTR”

有人可以告诉我为什么我会出错。 我一直试图弄清楚这一点。

    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";                                                    

谢谢!

LPCWSTRconst wchar_t*的别名。

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

您的drive2变量是一个wchar_t指针数组,因此为了将drive2[i]按原样传递给GetDriveType()MessageBox() ,您必须为 Unicode 编译您的项目(即,使UNICODE有条件地在编译时定义-time),这将使GetDriveType() map 到GetDriveTypeW()MessageBox() map 到MessageBoxW()以便它们只接受( wchar_t ) 字符串。 否则, GetDriveType()将 map 到GetDriveTypeA()MessageBox()将 map 到MessageBoxA()所以它们只接受char )字符串。

您正在将字符串文字传递给MessageBox() ,这在为 Unicode 编译时将不起作用。 如果您不为 Unicode 编译,则不能将字符串传递给TCHAR函数 - 这听起来像您的情况,因为错误消息抱怨将const wchar_t*指针传递给const char*参数。

在定义UNICODE时,您需要使用TEXT()宏来使字符串文字变宽,而不是变窄

我还建议将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 的 function 定义,并且只使用字符串文字,根本不要处理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;  
    }
}

LPCSTRconst char* ,而LPCWSTRconst wchar_t* ,它们不兼容。

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

正则字符串: LPCSTR string = "Regular string";

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

请注意, GetDriveType不是 function,它是一个宏,如果您的代码以 ASCII 模式(默认)编译,则扩展为GetDriveTypeA ,但如果代码以 UNICODE 模式编译,则扩展为GetDriveTypeW

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM