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

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

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

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

#include 
#include 

// 过程函数的定义
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, "www.baidu.com", strlen("www.baid.com"));
		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(多字节字符集) 编码,而 VS2013 及高版本 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、解决:

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

你可能感兴趣的:(bug收集仓)