首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"LPCWSTR“类型的参数与"LPCSTR”参数不相容

"LPCWSTR“类型的参数与"LPCSTR”参数不相容
EN

Stack Overflow用户
提问于 2020-04-15 19:02:43
回答 2查看 1.7K关注 0票数 0

谁能告诉我为什么我会出错。我已经想了一段时间了。

代码语言:javascript
复制
    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";                                                    

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-15 20:33:02

LPCWSTRconst wchar_t*的别名。

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

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

您正在将窄字符串文本传递给MessageBox(),它在为Unicode编译时不能工作。如果不为Unicode编译,则不能将宽字符串传递给TCHAR函数--这听起来就像您的情况一样,因为错误消息是在抱怨将const wchar_t*指针传递给const char*参数。

您需要使用TEXT()宏来使字符串文本在定义UNICODE时变宽,而不是狭窄。

我还建议将TEXT()用于drive2数组中的字符串文本,以匹配要将数组元素传递给的TCHAR函数。

而且,您的循环超出了drive2数组的范围。

说到这里,试试这个:

代码语言:javascript
复制
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

代码语言:javascript
复制
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;  
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-04-15 19:06:51

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

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

正则字符串:LPCSTR string = "Regular string";

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61236614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档