簡體   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