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 ),也可将单字节字符数组指针转为双字节字符数组指针,还没怎么没用到过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue如何过滤html标签,去除富文本中的html标签及vue、react、微信小顺序中的过滤器...

在猎取富文本后,又只需显现部分内容,须要去除富文本标签,然后再截取个中一部分内容;然后就是过滤器,在微信小顺序中运用照样挺屡次的,在vue及react中也遇到过1.富文本去除html标签去除html标签及 空格let r…

在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头

我是Vert.x的新手,但是作为Java开发人员(非常努力),与NodeJS或其他任何基于Reactor的框架/库相比,我觉得它更加有趣并且很有前途。 因此,我正在使用Vert.x实现一个非常简单的Restful API。 今天的问题是我…

OAuth2认证有一定的了解

转到分享界面后,进行OAuth2认证: 以新浪为例: 第一步、WebView加载界面,传递参数 使用WebView加载登陆网页,通过Get方法传递三个参数:应用的appkey、回调地址和展示方式display(如手机设备为mobile)&#x…

声速的测量的实验原理和应用_CEMS烟气在线分析仪测量原理计经典应用

烟气连续在线监测系统运用抽取冷凝采样、后散射烟尘浓度测量、皮托管烟气流速测量及计算机网络通讯技术,实现了固定污染源污染物排放浓度和排放总量的在线连续监测。同时又针对国内煤种较杂、煤质变化大、污染物排放浓度高、烟气湿度大的状况从技术上进行了改进。并…

怎么用计算机算弧度制,怎么设置计算器 把度数转化为弧度

计算器默认角度制(D)。此时,按下mode,mode,2(Rad),可将计算器调整为弧度制。输入要转化的角度(如30),按下shift,ans(DRG三角),1(D),画面将显示30度,按下等号,…

Python 类方法、实例方法、静态方法

实例方法:类中第一个参数为self的方法。 类方法:类中第一个参数为类,约定写为cls,并被classmethod修饰的方法。 静态方法:类中被staticmethod修饰的方法。 类变量:定义在类的定义之后,如&#x…

python 方程组 整数解_用Python语言求解线性整数方程组

我在寻找一种用Python求解线性方程组的方法。特别是,我在寻找大于所有零的最小整数向量,并解出给定的方程。例如,我有以下等式:想解决。在在这种情况下,求解该方程的最小整数向量为。在但是,如何自动确定此…

计算机软件水平考试调整,全国计算机等级考试调整方案

考生们注意:在新的历史时期,全国计算机等级考试将在保持自身特色,稳定发展的基础上进一步推进考试改革,从2018年3月起,教育部考试中心将实施2018年考试大纲,并按新体系开考各个考试级别,希望能帮…

javaserver_集成Spring和JavaServer Faces:改进的模板

javaserver随着2.0版的发布&#xff0c;Facelet模板成为JSF规范的核心部分。 使用<ui&#xff1a;composition>和<ui&#xff1a;decorate>标记&#xff0c;可以轻松构建复杂的页面&#xff0c;同时仍保持标记的整洁。 模板在创建HTML表单时特别有用&#xff0c;但…

datagrid 什么时候结束编辑_孕吐到底什么时候结束

很多女性刚怀孕&#xff0c;都会出现妊娠反应&#xff0c;比如孕吐。它是由妊娠后绒毛分泌的绒毛膜促进腺激素引起的&#xff0c;在妊娠初期腺激素分泌量较多。备受孕吐折磨的女性&#xff0c;每次吃饭&#xff0c;一闻到刺激性味道&#xff0c;就会想吐&#xff0c;非常难受&a…

201521123032 《Java程序设计》第7周学习总结

1. 本周学习总结 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合相关内容。 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 在contains方法中调用indexOF方法&#xff0c;首先比较下标o&#xff0c;如果onull那么elementData[]中是否n…

计算机图形图像电影论文,计算机图形图像绘制技术地现状分析及应用发展.doc...

计算机图形图像绘制技术地现状分析及应用发展计算机图形图像绘制技术的现状分析及应用发展-计算机论文计算机图形图像绘制技术的现状分析及应用发展金晓倩 JIN Xiao-qian(四川建筑职业技术学院&#xff0c;德阳618000)(Sichuan College of Architectural Technology&#xff0c…

Java EE 7之前版本替代JPA 2.1的非同步持久性上下文

Java EE 7中的非同步持久性上下文 JPA 2.1引入了非同步持久性上下文的概念&#xff0c;该概念允许对JPA实体管理器的刷新进行细粒度控制&#xff0c;即通过显式调用EntityManager&#xff03;joinTransaction 。 以前&#xff0c;这默认情况下是JTA事务的结束&#xff0c;例如&…

三相同步电机怎么接线图_三相电度表怎么看倍数

电工之家&#xff1a;www.dgzj.com QQ群&#xff1a;2179090关注电工之家官方微信公众号“电工之家”&#xff0c;收获更多经验知识。从题主给的照片来看&#xff0c;这个电度表型号是DTS901-4 1.5(6)A 3X220V/380V精确度为1的1级互感器间接接线的三相四线有功电子电度表。那…

第七周进度表

所花时间 7   代码量&#xff08;行&#xff09; 235 博客量 2 所学知识点 了解了结队开发 转载于:https://www.cnblogs.com/muxiaozhou/p/6993180.html

中国计量大学调剂计算机技术,2020年中国计量大学硕士研究生招生调剂公告

一、调剂分数线&#xff1a;详见《中国计量大学2020年硕士研究生招生复试分数线》。二、调剂程序&#xff1a;1.第一阶段&#xff1a;登陆我校“研究生招生信息系统”网址https://yjsb.cjlu.edu.cn/yjszs_xsb/登记调剂信息。此信息用于复试&#xff0c;请务必认真准确填写。2.第…

linux msgrcv阻塞接收_linux下高并发服务器实现

在做网络服务的时候tcp并发服务端程序的编写必不可少。tcp并发通常有几种固定的设计模式套路&#xff0c;他们各有优点&#xff0c;也各有应用之处。下面就简单的讨论下这几种模式的差异&#xff1a;单进程&#xff0c;单线程在accept之后&#xff0c;就开始在这一个连接连接上…

Maven配置tomcat和jetty插件来运行项目

针对eclipse中的Run on Server有些情况下并不是那么好操作&#xff0c;比如配置maven下的springmvc插件&#xff0c;如果使用此方法运行会很容易出现组件缺少导致错误出现一大堆的问题。 那么针对这种情况&#xff0c;maven下的容器插件tomcat和jetty做了很好的支持。比如在mav…

使用Apache Storm和Kite SDK Morphlines的可配置ETL处理

从我担任软件工程师的第一天起&#xff0c;我总是听到很多方面的相同要求&#xff1a; “ 我们希望所有内容都可配置&#xff0c;我们希望在运行时更改所有内容&#xff0c;我们希望有一个可视化工具来应用所有这些逻辑&#xff0c;以便非开发人员使用和配置我们的应用程序。 …

宁夏警官学院计算机专业,宁夏警官职业学院毕业设计模板.docx

宁夏警官职业学院本科生毕业论文题目&#xff1a;基于人工智能的宁夏警官职业学院的论文排版系统研究姓 名&#xff1a; 宁夏警官职业学院论文学 号&#xff1a; 20185091612院 系&#xff1a; 宁夏警官职业学院信息学院专 业&#xff1a; 计算机指导教师&#xff1a; Megan教授…