【问题标题】:Argument of type "LPCWSTR" is incompatible of the parameter of type "LPCSTR"“LPCWSTR”类型的参数与“LPCSTR”类型的参数不兼容
【发布时间】:2020-04-15 19:02:43
【问题描述】:

谁能告诉我为什么我会出错。我一直在尝试解决这个问题。

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

谢谢!

【问题讨论】:

    标签: c++ lpcwstr


    【解决方案1】:

    LPCWSTRconst wchar_t* 的别名。

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

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

    您将 narrow 字符串文字传递给 MessageBox(),这在为 Unicode 编译时不起作用。如果您不为 Unicode 编译,则不能将 wide 字符串传递给 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的函数定义,并且只使用wide字符串文字,不要处理完全是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;  
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      常规字符串: LPCSTR string = "Regular string";

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

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

      【讨论】:

      • 如果定义了UNICODE,则不需要显式使用W 版本,并且应该为所有新项目定义。 (虽然 UTF-8 支持正在增加......)
      • 据我所知默认没有定义。您应该在项目属性中定义它或添加相应的标志。编辑:我刚刚检查过,默认仍然是多字节(ASCII)
      • 我认为明确使用 W 或 A 版本是最安全的,具体取决于您的意图。那么你就不必假设任何事情了。
      猜你喜欢
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多