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等之间的转换大全 | 求索阁相关推荐

  1. CString 和 LPCTSTR等之间的转换

    CString   和   LPCTSTR   可以说通用.   原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已. 常量字符串ansi和unicode的区分是由宏 ...

  2. cad 怎么显示块句柄_新手必看的CAD小技巧,老师傅精选汇总,三分钟教你学习用处多多...

    零基础新手必看的CAD绘图小技巧,这里分享给你,都是老师傅精选汇总,实实在在用得上,希望能够给你带去帮助! PS:其实CAD入门并不难,难在坚持,如果真的想要入这个行业,一定要你坚持哦! 废话不说了直 ...

  3. Web.config配置文件详解(新手必看)

    Web.config配置文件详解(新手必看) 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点. ...

  4. wdatepicker设置时间范围_Mac新手必看,这些设置可以让你的Mac更好用!

    如果你刚买了一台新的Mac,不免要对Mac做一些设置,现为你提供一些Mac常用的设置技巧,让你的Mac更加好用. Mac新手必看,这些设置可以让你的Mac更好用! - macw下载站​www.macw ...

  5. python中是干嘛的-python是做什么的,新手必看哦!

    原标题:python是做什么的,新手必看哦! ​python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C 之后的的第三大语言.特点:简单易学 ...

  6. 新手必看的编程介绍,帮你推荐学习方案!

    新手必看的编程介绍,帮你推荐学习方案! VB是什么? ) y0 {6 G# G; j3 B VB 是Visual Basic编程语言 * B. O2 G# z) O1 |- g8 `4 ^ 编写计算机 ...

  7. python的难点_初学python的操作难点总结(新手必看篇)

    如下所示: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格目标文件 cd p 4 写文件的第一个字母 ...

  8. 电脑故障维修:新手必看的修电脑技巧!

    日常生活工作中,我们的电脑总会出现各种各样的问题,如果掌握了一定的通用修电脑技巧,除了可以解决问题,说不定还能得到帮女神修电脑的机会,俗话说的好,电脑修的好,对象少不了! 电脑故障判断一般本着先&qu ...

  9. python新手入门总结_初学python的操作难点总结(新手必看篇)

    如下所示: 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格目标文件 cd p 4 写文件的第一个字母 ...

最新文章

  1. 中国式巨婴,到底有多可怕?
  2. 在CSS3中,可以利用transform功能来实现文字或图像的旋转、缩放、倾斜、移动这四种类型的变形处理...
  3. P1892-团伙【图论,并查集】
  4. jaxb注解使用_使用JAXB时
  5. jooq 生成数据库_jOOQ类型安全数据库查询教程
  6. 前端学习(601):集成react插件
  7. mysql慢sql增加读写分离_MySQL主从同步+读写分离
  8. nanf flash校验_C ++中带有示例的nanf()函数
  9. sqlserver两个日期之间的年数_SQL语句计算两个日期之间有多少个工作日的方法
  10. 初二因式分解奥数竞赛题_八年级数学因式分解专项练习试题.doc
  11. DjangoForm 之创建FORM模板进行验证
  12. Adobe Flash Builder 4 序列号
  13. 小趣味:js编写斗地主规则(完整代码)
  14. ENVI基本操作之彩色合成
  15. c语言结构体应用例程:输入今天日期,输出明天日期
  16. kali linux 命令
  17. 新闻发布系统之浅谈分页技术
  18. 服装门店系统php,多客服装门店管理系统软件
  19. 闲鱼提效最佳实践:打造OKR机制下的数据驱动敏捷团队
  20. 这怎么回事?宝宝边吃母乳边用手推妈妈,宝宝的心思知多少

热门文章

  1. [渝粤教育] 重庆工业职业技术学院 汽车安全与舒适系统维修 参考 资料
  2. 【渝粤题库】广东开放大学 文化服务营销管理 形成性考核
  3. 【案例分享】无线唤醒技术在灌溉系统上的应用案例
  4. 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题
  5. 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍条件,宿舍环境图片(10篇)...
  6. mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置
  7. 八数码深度优先搜索_深度优先搜索和广度优先搜索
  8. 我曾经是怎么做面试官的
  9. Docker 内程序时间设置,很重要
  10. 遍历List过程中同时修改