“char *” 类型的实参与 “LPCWSTR” 不兼容

发布于 2021-01-09  143 次阅读


0x00 问题描述

在部分操作系统编程中,可能会涉及到LPCWSTR, DOWRD, WCHAR等变量类型,在 Visual Studio 中直接编译会无法通过,比如这样:

密集恐惧症.jpg

如果你是直接copy别人的实验代码,可能连通过编译都困难

但是DEV C++或者 mingw-w64 就能很顺畅的编译运行——说明BUG不在程序,大概率在编码

当然,如果你使用了某些VS认为不安全的函数......自行修改函数或者在程序开头加上这句话:

#define _CRT_SECURE_NO_WARNINGS

0x01 解决方案

如果只是上述图片的报错,那么有两种解决方案:改变变量类型、修改编码

改变变量类型:TEXT 宏

TEXT宏的作用是为了对字符处理的透明化:只要在程序中有 unicode 宏的,那么就使用宽字符;否则使用单字节字符,保证程序的可移植性。

使用方法大致如下:

报错的代码:直接将 const char* 隐式转为 const TCHAR*

const TCHAR szFileMappingName[] = "PCFileMappingObject";
const TCHAR szMutexName[] = "PCMutex";
const TCHAR szSemaphoreEmptyName[] = "PCSemaphoreEmpty";
const TCHAR szSemaphoreFullName[] = "PCSemaphoreFull";

正确的代码:使用TEXT()转换

const TCHAR szFileMappingName[] = TEXT("PCFileMappingObject");
const TCHAR szMutexName[] = TEXT("PCMutex");
const TCHAR szSemaphoreEmptyName[] = TEXT("PCSemaphoreEmpty");
const TCHAR szSemaphoreFullName[] = TEXT("PCSemaphoreFull")

改变 VS 字符集

VS的字符集设置在项目属性中:

项目→属性→配置属性→高级→高级属性→字符集→使用多字节字符集

属性

修改字符集