0

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

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

谢谢!

4

2 回答 2

1

LPCWSTR是 的别名const wchar_t*

您正在使用和函数 的TCHAR版本。映射到if在编译时定义,否则映射到.GetDriveType()MessageBox()TCHARwchar_tUNICODEchar

您的drive2变量是一个wchar_t指针数组,因此为了将drive2[i]原样传递给GetDriveType()and MessageBox(),您必须为 Unicode 编译您的项目(即,UNICODE在编译时定义条件),这将使GetDriveType()map toGetDriveTypeW()MessageBox()map to MessageBoxW()so他们只接受( 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-15T20:33:02.133 回答
0

LPCSTRis const char*, while LPCWSTRis const wchar_t*, 它们不兼容。

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

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

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

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

于 2020-04-15T19:06:51.430 回答