L表示long指针
      这是为了兼容Windows  3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中,  long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
      P表示这是一个指针;C表示是一个常量;T表示在Win32环境中,  有一个_T宏,这个宏用来表示你的字符是否使用UNICODE,  如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串;STR表示这  个变量是一个字符串。所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样,  LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。
      LPCTSTR == const  TCHAR *,
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函数。

CString  转LPCTSTR:

CString cStr;

const char  *lpctStr=(LPCTSTR)cStr;

LPCTSTR转CString:
LPCTSTR lpctStr;
CString  cStr=lpctStr;

LPCTSTR 用法的更多相关文章

  1. C语言中system()函数的用法总结(转)

    system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...

  2. C++——CString用法大全

    列表形式的如下: CString的构造函数CString( );例:CString csStr; CString( const CString& stringSrc );例:CString c ...

  3. Bitset 用法(STL)

    std::bitset是STL的一个模板类,它的参数是整形的数值,使用位的方式和数组区别不大,相当于只能存一个位的数组.下面看一个例子 bitset<20> b1(5); cout< ...

  4. CString用法总结

    概述:CString是MFC中提供的用于处理字符串的类,是一种很有用的数据类型. 它很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作时方便了很多. 不管怎样,使用CString有很多的特殊 ...

  5. 线程中CreateEvent和SetEvent及WaitForSingleObject的用法

    首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...

  6. char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR

    转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收 ...

  7. c++中__declspec用法总结

    “__declspec”是Microsoft c++中专用的关键字,它配合着一些属性可以对标准C++进行扩充.这些属性有:align.allocate.deprecated. dllexport.dl ...

  8. CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法

    一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...

  9. LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义

    UNICODE:它是用两个字节表示一个字符的方法.比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNI ...

随机推荐

  1. 理解insert all/insert first的使用

    在常用的SQL写法中我们会经常遇到把一个表的数据插入另外一张表的情况,这是一个insert into 表名 select .... from 表名   就可以解决了.但是如果是把一张表的数据同时插入两 ...

  2. Shell 之外 试试不操作 shell 来实现同样的效果

    执行程序时发生了什么当你双击桌面上的终端程序图标时,就会打开一个载入shell的程序. 你键入的命令不会直接在内核执行,而是先和 shell 进行交互.Command (eg. `ls -l')↓Te ...

  3. Bootstrap css背景图片的设置

    一. 网页中添加图片的方式有两种 一种是:通过<img>标签直接插入到html中 另一种是:通过css背景属性添加 居中方法:水平居中的text-align:center 和 margin ...

  4. Java序列化机制

    java的序列化机制支持将对象序列化为本地文件或者通过网络传输至别处, 而反序列化则可以读取流中的数据, 并将其转换为java对象. 被序列化的类需要实现Serializable接口, 使用Objec ...

  5. Android课程---用进度条改变图片透明度

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  6. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

  7. 【iCore3 双核心板_FPGA】例程七:基础逻辑门实验——逻辑门使用

    实验指导书及代码包下载: http://pan.baidu.com/s/1Rs18U iCore3 购买链接: https://item.taobao.com/item.htm?id=52422943 ...

  8. SQL优化 1

    SQL_ID:fvdwtfv18yy0m 先看看sql的预估执行计划 select * from table(dbms_xplan.display_awr('fvdwtfv18yy0m')); sql ...

  9. GFS文件系统和在RedHat Linux下的配置

    GFS的全称是Google file System,为了满足Google迅速增长的数据处理要求,Google设计并实现的Google文件系统(GFS).Google文件系统是一个可扩展的分布式文件系统 ...

  10. JQuery-筛选

    /* 六丶筛选 */ // console.log( $("div:first") ); // div#id_1 所有div中的第一个 // console.log( $(&quo ...