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

谢谢!

LPCSTRconst char*,而LPCWSTRconst wchar_t*,不兼容

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

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

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

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

LPCWSTRconst wchar_t*.

的别名

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

你的 drive2 变量是一个 wchar_t 指针数组,所以为了将 drive2[i] 按原样传递给 GetDriveType()MessageBox(),你必须为 Unicode 编译项目(即,在编译时定义 UNICODE 条件),这将使 GetDriveType() 映射到 GetDriveTypeW() and MessageBox() map to MessageBoxW() so that they accept only wide (wchar_t) strings. Otherwise, GetDriveType() will map to GetDriveTypeA() and MessageBox() will map to MessageBoxA(),因此它们只接受 缩小 (char) 个字符串。

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

当定义 UNICODE 时,您需要使用 TEXT() 宏来使字符串文字 wide 而不是 narrow .

我还建议您也对 drive2 数组中的字符串文字使用 TEXT(),以匹配您将数组元素传递给的 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 string仅文字,根本不处理 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;  
    }
}