cstringw转lpctstr_新手必看:CString 和 LPCTSTR等之间的转换大全 | 求索阁
CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。
常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T( "abcd ")时, 字符串 "abcd "就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR 也是相同目的字符宏。 看看定义就明白了。简单起见,下面只介绍 ansi 的情况,unicode 可以类推。
ansi情况下,LPCTSTR 就是 const char*, 是常量字符串(不能修改的)。
而LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。
这两种都是基本类型, 而CString 是 C++类, 兼容这两种基本类型是最起码的任务了。
由于const char* 最简单(常量,不涉及内存变更,操作迅速), CString 直接定义了一个类型转换函数
operator LPCTSTR() {......}, 直接返回他所维护的字符串。
当你需要一个const char* 而传入了CString时, C++编译器自动调用 CString重载的操作符 LPCTSTR()来进行隐式的类型转换。
当需要CString , 而传入了 const char* 时(其实 char* 也可以),C++编译器则自动调用CString的构造函数来构造临时的 CString对象。
因此CString 和 LPCTSTR 基本可以通用。
但是 LPTSTR又不同了,他是 char*, 意味着你随时可能修改里面的数据,这就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。
所以 不能随便的将 const char* 强制转换成 char* 使用。
楼主举的例子
LPSTR lpstr = (LPSTR)(LPCTSTR)string;
就是这种不安全的使用方法。
这个地方使用的是强制类型转换,你都强制转换了,C++编译器当然不会拒绝你,但同时他也认为你确实知道自己要做的是什么。因此是不会给出警告的。
强制的任意类型转换是C(++)的一项强大之处,但也是一大弊端。这一问题在 vc6 以后的版本(仅针对vc而言)中得到逐步的改进(你需要更明确的类型转换声明)。
其实在很多地方都可以看到类似
LPSTR lpstr = (LPSTR)(LPCTSTR)string;
地用法,这种情况一般是函数的约束定义不够完善的原因, 比如一个函数接受一个字符串参数的输入,里面对该字符串又没有任何的修改,那么该参数就应该定义成 const char*, 但是很多初学者弄不清const地用法,或者是懒, 总之就是随意写成了 char* 。 这样子传入CString时就需要强制的转换一下。
这种做法是不安全的,也是不被建议的用法,你必须完全明白、确认该字符串没有被修改。
CString 转换到 LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数,使用完毕之后一般都要再调用ReleaseBuffer函数来确认修改 (某些情况下也有不调用ReleaseBuffer的,同样你需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。
同时需要注意的是, 在GetBuffer 和 ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。
LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化(转)
首先在编译程序时经常会遇到这种问题:
错误 1 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”
1、觉得很烦,一般的做法就是不管三七二十一,在字符串前面加一个‘L’:
如调用函数FUN(LPCTSTR str)时,不能 FUN("HELLO"); 而是FUN(L"HELLO");
通常这样做都比较能解决问题。
2、或者还可以用_T(), 即 FUN(_T("HELLO")); _T() 的别名还有 _TEXT(), TEXT()。
稍微研究了下,BSTR,LPSTR,LPWSTR,LPCTSTR,LPTSTR等这些让人头晕的东东。(还是C#里简单啊,直接tostring)
BSTR:是一个OLECHAR*类型的Unicode字符串,是一个COM字符串,带长度前缀,与VB有关,没怎么用到过。
LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针
LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针
LPCSTR:即const char *
LPCWSTR:即const wchar_t *
LPTSTR:LPSTR、LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI
LPCTSTR: LPCSTR、LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI,如下是从MFC库中拷来的:
#ifdef UNICODE
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
3、相互转换方法:
LPWSTR->LPTSTR: W2T();
LPTSTR->LPWSTR: T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();
ANSI->UNICODE: A2W();
UNICODE->ANSI: W2A();
另外,CString转为CStringW方法(通过一个wchar_t数组来转)
CString str;
CStringW strw;
wchar_t *text = new wchar_t[sizeof(wchar_t) * str.GetLength()];
MultiByteToWideChar(CP_ACP,0,str,-1,text,str.GetLength());
strw = text;
4、另外,还可以强行转换,不过不一定能成功
5、还有_bstr_t ( 对BTSTR的封装,需要#include ),也可将单字节字符数组指针转为双字节字符数组指针,还没怎么没用到过。
cstringw转lpctstr_新手必看:CString 和 LPCTSTR等之间的转换大全 | 求索阁相关推荐
- CString 和 LPCTSTR等之间的转换
CString 和 LPCTSTR 可以说通用. 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已. 常量字符串ansi和unicode的区分是由宏 ...
- cad 怎么显示块句柄_新手必看的CAD小技巧,老师傅精选汇总,三分钟教你学习用处多多...
零基础新手必看的CAD绘图小技巧,这里分享给你,都是老师傅精选汇总,实实在在用得上,希望能够给你带去帮助! PS:其实CAD入门并不难,难在坚持,如果真的想要入这个行业,一定要你坚持哦! 废话不说了直 ...
- Web.config配置文件详解(新手必看)
Web.config配置文件详解(新手必看) 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点. ...
- wdatepicker设置时间范围_Mac新手必看,这些设置可以让你的Mac更好用!
如果你刚买了一台新的Mac,不免要对Mac做一些设置,现为你提供一些Mac常用的设置技巧,让你的Mac更加好用. Mac新手必看,这些设置可以让你的Mac更好用! - macw下载站www.macw ...
- python中是干嘛的-python是做什么的,新手必看哦!
原标题:python是做什么的,新手必看哦! python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C 之后的的第三大语言.特点:简单易学 ...
- 新手必看的编程介绍,帮你推荐学习方案!
新手必看的编程介绍,帮你推荐学习方案! VB是什么? ) y0 {6 G# G; j3 B VB 是Visual Basic编程语言 * B. O2 G# z) O1 |- g8 `4 ^ 编写计算机 ...
- python的难点_初学python的操作难点总结(新手必看篇)
如下所示: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格目标文件 cd p 4 写文件的第一个字母 ...
- 电脑故障维修:新手必看的修电脑技巧!
日常生活工作中,我们的电脑总会出现各种各样的问题,如果掌握了一定的通用修电脑技巧,除了可以解决问题,说不定还能得到帮女神修电脑的机会,俗话说的好,电脑修的好,对象少不了! 电脑故障判断一般本着先&qu ...
- python新手入门总结_初学python的操作难点总结(新手必看篇)
如下所示: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格目标文件 cd p 4 写文件的第一个字母 ...
最新文章
- 中国式巨婴,到底有多可怕?
- 在CSS3中,可以利用transform功能来实现文字或图像的旋转、缩放、倾斜、移动这四种类型的变形处理...
- P1892-团伙【图论,并查集】
- jaxb注解使用_使用JAXB时
- jooq 生成数据库_jOOQ类型安全数据库查询教程
- 前端学习(601):集成react插件
- mysql慢sql增加读写分离_MySQL主从同步+读写分离
- nanf flash校验_C ++中带有示例的nanf()函数
- sqlserver两个日期之间的年数_SQL语句计算两个日期之间有多少个工作日的方法
- 初二因式分解奥数竞赛题_八年级数学因式分解专项练习试题.doc
- DjangoForm 之创建FORM模板进行验证
- Adobe Flash Builder 4 序列号
- 小趣味:js编写斗地主规则(完整代码)
- ENVI基本操作之彩色合成
- c语言结构体应用例程:输入今天日期,输出明天日期
- kali linux 命令
- 新闻发布系统之浅谈分页技术
- 服装门店系统php,多客服装门店管理系统软件
- 闲鱼提效最佳实践:打造OKR机制下的数据驱动敏捷团队
- 这怎么回事?宝宝边吃母乳边用手推妈妈,宝宝的心思知多少
热门文章
- [渝粤教育] 重庆工业职业技术学院 汽车安全与舒适系统维修 参考 资料
- 【渝粤题库】广东开放大学 文化服务营销管理 形成性考核
- 【案例分享】无线唤醒技术在灌溉系统上的应用案例
- 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题
- 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍条件,宿舍环境图片(10篇)...
- mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置
- 八数码深度优先搜索_深度优先搜索和广度优先搜索
- 我曾经是怎么做面试官的
- Docker 内程序时间设置,很重要
- 遍历List过程中同时修改