Аргумент типа «LPCWSTR» несовместим с параметром типа «LPCSTR» - PullRequest
0 голосов
/ 15 апреля 2020

Может кто-нибудь, пожалуйста, скажите мне, почему я получаю ошибку. Я пытался понять это немного сейчас.

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

LPCWSTR - псевдоним для const wchar_t*.

Вы используете TCHAR версию функций GetDriveType() и MessageBox(). TCHAR отображается на wchar_t, если UNICODE определен во время компиляции, в противном случае он отображается на char.

Ваша переменная drive2 является массивом wchar_t указателей, поэтому по порядку чтобы передать drive2[i] как есть на GetDriveType() и MessageBox(), вы должны скомпилировать свой проект для Unicode (ie, сделать условное UNICODE определенным во время компиляции), что сделает GetDriveType() сопоставить с GetDriveTypeW() и MessageBox() сопоставить с MessageBoxW(), чтобы они принимали только строки wide (wchar_t). В противном случае GetDriveType() будет отображаться на GetDriveTypeA(), а MessageBox() будет отображаться на MessageBoxA(), поэтому они принимают только узкие (char) строки .

Вы передаете узкие строковые литералы в MessageBox(), которые не будут работать при компиляции для Unicode. И вы не можете передавать строки wide в функции TCHAR, если вы НЕ компилируете для Unicode - что звучит так, как в вашей ситуации, так как сообщение об ошибке жалуется на передачу указателя const wchar_t* на параметр const char*.

Вам нужно использовать макрос TEXT(), чтобы строковые литералы были шириной , когда определено UNICODE, а не узкий .

Я бы также предложил использовать TEXT() для строковых литералов в вашем массиве drive2, чтобы соответствовать TCHAR функциям, которым вы передаете элементы массива.

Кроме того, ваш l oop выходит за границы массива 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;  
    }
}
0 голосов
/ 15 апреля 2020

LPCSTR равно const char*, а LPCWSTR равно const wchar_t*, и они несовместимы.

Объявление широкой строки в C ++: LPCWSTR string = L"Wide string";

Обычная строка: LPCSTR string = "Regular string";

Если вы хотите использовать широкие строки, вам нужно использовать версию W, в вашем случае используйте GetDriveTypeW.

Обратите внимание, что GetDriveType не функция, это MACRO, который расширяется до GetDriveTypeA, если ваш код компилируется в режиме ASCII (по умолчанию), но расширяется до GetDriveTypeW, если код компилируется в режиме UNICODE

...