[C/C++] PCWSTR LPCTSTR等等
乌拉~~~ 这是我第一百篇博文咯~
为什么会有这个
真的开发windows程序的时候会发现,各种字符指针好乱,正是因为被弄昏了头,所以才要记清楚。。。
尤其是发现 最开始学的strcmp()什么的都不好使了,有点乱
Windows的API到底好不好使。。。 一眼看上去真的很恐怖,但是实际上真的已经比较友好了。。
参考: https://blog.csdn.net/gaoyang610/article/details/21234979
先看这个LPCWSTR
、LPCSTR
、LPCTSTR
- L: 表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
- P: 表示这个是个指针,,所以这个“字符串”实际上不占用堆空间
- C: 指的是const,是个常量
- T: 表示在win32环境中,有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
- STR: 表示这是个字符串
- W: Wide宽字符
所以就可以解释为
- LPCWSTR: 是一个指针,是个常量,并且是宽型(Wide)字符串,与
const wchar_t*
等效 - LPCTSTR: 是一个指针,也是常量,等效于
const TCHAR*
L"" 宏
L"Hello",表示"Hello"是一个Unicode字符串
直接用""包裹的字符串是ANSI编码的字符串
当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
from: https://baike.baidu.com/item/TCHAR/1865865
LPCWSTR字符串比较
if (!_wcsicmp(lpName, pe.szExeFile))
{
return pe.th32ProcessID;
}
越看越乱
wchar_t 和 char 之间转换
from: https://www.cnblogs.com/vranger/p/3792791.html
使用函数 WideCharToMultiByte(),此函数把宽字符串转换成指定的新的字符串,如ANSI 等,新字符串不必是多字节字符集。
wchar_t* pwszUnicode = L"Holle"; //wcslen(pwsUnicode)=5
int iSize;
char* pszMultiByte;//返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0'
iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL); //iSize =wcslen(pwsUnicode)+1=6
pszMultiByte = (char*)malloc(iSize*sizeof(char)); //不需要 pszMultiByte = (char*)malloc(iSize*sizeof(char)+1);
WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
使用函数 MultiByteToWideChar(),此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。
char* pszMultiByte = "Holle"; //strlen(pwsUnicode)=5
int iSize; wchar_t* pwszUnicode ;
//返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0'
iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte , -1, NULL, 0); //iSize =wcslen(pwsUnicode)+1=6
pwszUnicode = (wchar_t *)malloc(iSize*sizeof(wchar_t)); //不需要 pwszUnicode = (wchar_t *)malloc((iSize+1)*sizeof(wchar_t))
MultiByteToWideChar(CP_ACP, 0, pszMultiByte , -1, pwszUnicode , iSize);
关于 ANSI编码
经过百度可以知道,ANSI并不是指的某一个编码,在不同国家的windows中ANSI是不同的字符集,比如说在中国ANSI == GBK,但是在日本就是另一种字符集了。
[C/C++] PCWSTR LPCTSTR等等的更多相关文章
- 【笨嘴拙舌WINDOWS】字符类型与字符串
"我将用C语言作为工具,开始WINDOWS API的使用" windows NT 从底层开始支持unicode. 1.字符类型 WINDOWS的字符类型在WINNT.H和CTYPE ...
- LPCTSTR和LPTSTR和char *究竟有什么区别
LPSTR = char* LPCSTR = const char* LPTSTR: 如果定义了UNICODE宏,那么LPTSTR = wchar_t*否则LPTSTR = char* LPCTSTR ...
- MFC中的乱起八糟----字符编码:LPTSTR,LPCTSTR, TCHAR等
注意,编写有 Unicode 意识的代码总是一件好事,比如: CString graycat = CString(_T("Gray")) + _T("Cat") ...
- Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
DWORD:本来被定义为unsigned long,DWORD的含义就是双字,一个字是2字节,双字就是32字节. 但是在C/C++中,经常会用到把一个指针转换成数字储存,然后再将其传唤为指针调用.那么 ...
- error C2664: 'TextOutW' : cannot convert parameter 4 from const char [5]' to LPCTSTR
转自:http://blog.sina.com.cn/s/blog_4aa4593d0100odra.html 问题的原因是字符串ANSI和Unicode编码的区别, VC6与VS2003等默认使用A ...
- LPCTSTR 用法
L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用 ...
- char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR
转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收 ...
- 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。
编译程序的时候出现这样的错误,原因是在新建MFC项目的时候,设置字符集Unicode的属性. 解决方法一: 在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点 ...
- LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义
UNICODE:它是用两个字节表示一个字符的方法.比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNI ...
- LPSTR、LPCSTR、LPWSTR、LPCWSTR、LPTSTR、LPCTSTR的来源及意义
1. Unicode字符集: 它是用两个字节表示一个字符的方法.比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字 ...
随机推荐
- gpedit.msc 打不开
win10系统推出已有不短的时间了,朋友们也纷纷升级了win10系统,但是暴露的问题也是越来越多,比如win10系统打开运行输入gpedit.msc命令时却提示找不到文件.那出现win10打不开gpe ...
- Gorm 关联关系介绍与基本使用
目录 一 Belongs To(一对一) 1.1 Belongs To 1.2 重写外键 1.3 重写引用(一般不用) 1.4 Belongs to 的 CRUD 1.5 预加载 1.6 外键约束 二 ...
- 解决: DECODER_ERROR_CLASSES += (brotli.error,) ttributeError: module ‘brotli‘ has no attribute ‘error‘
解决: DECODER_ERROR_CLASSES += (brotli.error,) ttributeError: module 'brotli' has no attribute 'error' ...
- NetCat 工具的常用使用技巧
netcat 黑客们的瑞士军刀,虽然小巧但是其功能一点也不弱,并且该工具天生免杀,值得你去尝试. NCwindows反弹 1:正向连接 服务器执行:nc -l -p 8888 -e cmd.exe 本 ...
- 遥感图像处理笔记之【Machine Learning CS-433 - Class Project 2 - Road Segmentation - EPFL】
遥感图像处理学习(8) 前言 遥感系列第8篇.遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2024年1月2日 本文再编辑于2024年1月4日:附作者改进U-Net网络图片:文字补充说明 20 ...
- Qt信号槽原理
1.说明 使用Qt已经好几年了,一直以为自己懂Qt,熟悉Qt,使用起来很是熟练,无论什么项目,都喜欢用Qt编写.但真正去看Qt的源码,去理解Qt的思想也就近两年的事. 本次就着重介绍一下Qt的核心功能 ...
- Linux 中通过虚拟地址获取物理地址并锁定
在 Linux 开发过程中,申请内存后,某些时候需要用物理地址传给其他外设进行写入或者读取操作,同时考虑到防止被操作系统 sawp,导致实际的物理地址发生变化,从而在操作对应的虚拟地址时无法正常运行等 ...
- (python)做题记录||2024.2.4||题目是codewars的【 All Balanced Parentheses】
题目链接:https://www.codewars.com/kata/5426d7a2c2c7784365000783/python 我的解决方案: def balanced_parens(n): # ...
- https、UDP的加密原理,其它传输层的同理
总结: 1.若应用需要使用http协议,那么就直接使用 https + 购买证书的方式. 2.若项目需要使用udp协议(浏览器不支持udp,所以只能是客户端软件包含APP),那么就需要将公钥内置在AP ...
- 域名解析迟迟不生效,刷新本地DNS的方法
ipconfig /flushdns 刷新后,再ping 发生域名解析 的指向就对了.!