2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > IntelliSense: const char * 类型的实参与 LPCWSTR 类型的形参不兼容

IntelliSense: const char * 类型的实参与 LPCWSTR 类型的形参不兼容

时间:2022-09-30 05:49:52

相关推荐

IntelliSense:  const char * 类型的实参与 LPCWSTR 类型的形参不兼容

1、 在Windows程序设计中遇到错误:

(1)IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容

(2)IntelliSense: 不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体

#include <windows.h>#include <stdio.h>// 过程函数的定义LRESULT CALLBACK WinSunProc(HWND hwnd,//窗口句柄UINT uMsg,//消息常量标识符WPARAM wParam,//特定附加消息LPARAM lParam//特定附加消息){switch (uMsg){case WM_CHAR:char szChar[20];sprintf_s(szChar, "char code is %d", wParam);MessageBox(hwnd, szChar, "char", 0);break;case WM_LBUTTONDOWN:MessageBox(hwnd, "mouse clicked", "message", 0);HDC hdc;hdc = GetDC(hwnd);//不能在响应WM_PAINT消息时调用TextOut(hdc, 0, 50, "你好", strlen("你好"));//ReleaseDC(hwnd);break;case WM_PAINT:HDC hDC;PAINTSTRUCT ps;hDC = BeginPaint(hwnd, &ps);//只能在WM_PAINT消息时调用TextOut(hDC, 0, 0, "", strlen(""));EndPaint(hwnd, &ps);break;case WM_CLOSE:if (IDYES == MessageBox(hwnd, "是否结束?", "message", MB_YESNO)){DestroyWindow(hwnd);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;}// 主函数入口int WINAPI WinMain(HINSTANCE hInstance,//当前实例句柄HINSTANCE hPrevInstance,//当前实例前一个实例句柄LPSTR lpCmdLine,//命令行int nCmdShow//显示方式){// 设计一个窗口类WNDCLASS wndcls;wndcls.cbClsExtra = 0;//附加内存空间wndcls.cbWndExtra = 0;//附加内存空间wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//背景色wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);//光标wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);//图标wndcls.hInstance = hInstance;//当前实例句柄wndcls.lpfnWndProc = WinSunProc;//消息处理函数wndcls.lpszClassName = "baidu";//**窗口类名称**//wndcls.lpszMenuName = NULL;//菜单名wndcls.style = CS_HREDRAW | CS_VREDRAW;//窗口长/宽改变时重绘RegisterClass(&wndcls);//注册窗口类// 创建窗口,定义一个变量来保存创建窗口后返回的句柄HWND hwnd;hwnd = CreateWindow("baidu", "标题", //**窗口标题**//WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);// 显示及刷新窗口ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);// 定义消息结构体,开始消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);//将消息回传给系统}return msg.wParam;//返回特定附加标识}

其中bug

(1)

wndcls.lpszClassName="baidu";

错误提示:IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容

(2)

hwnd = CreateWindow("baidu", "标题", //**窗口标题**//WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);

错误提示:IntelliSense: 不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体

2、原因分析:

这是由于字符编码问题引起的。

VC6 默认使用的 MBCS(多字节字符集) 编码,而 VS及高版本 VS默认使用的 Unicode编码。

3、三种编码格式

所有的string类都是以C-style字符串为基础的。C-style字符串是字符数组。字符类型有三种编码格式:

(1)第一种是单字节字符集(singlebyte character set or SBCS)。

在这种编码格式下,所有字符都只用一个字节表示,ASCII码就是单字节字符。用"0"来表示一个字节的结束。

(2)第二种编码格式是多字节字符集(multi-bytecharacter set or MBCS)。

即:支持多字节的字符集。

多字节字符集 (MBCS) 是一种旧的方式以支持无法用单字节表示的字符集(如日文和中文)的方法。 如果执行新开发,对于所有的文本字符串应该使用Unicode,除非最终用户没有看到系统字符串。 MBCS 是传统技术,不建议用于新开发中。

最常见的 MBCS 实现是双字节字符集(DBCS)。在Windows里的MBCS包含两种字符类型:单字节字符(singlebyte characters )和双字节字符(doublebyte characters)。

由于Windows里使用的多字节字符绝大部分是两个字节长,MBCS常被DBCS(double-byte character set)代替。

一般来说,VisualC++(尤其是 MFC)完全支持 DBCS。

(3)第三种编码格式是Unicode。

最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符。显然,这样要表示各种语言中所有的字符是远远不够的。Unicode4.0规范考虑到了这种情况,定义了一组附加字符编码,附加字符编码采用2个16位来表示,这样最多可以定义1048576个附加字符,目前unicode4.0只定义了45960个附加字符。

Unicode只是一个编码规范,目前实际实现的unicode编码只有三种:UTF-8,UCS-2和UTF-16,三种unicode字符集之间可以按照规范进行转换。

4、解决:

在工程中右击属性——>配置属性——>常规——>字符集——>使用多字节字符集

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。