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. javascript平时小例子④(setInterval使用2)

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...

  2. 【iCore3 双核心板_ uC/OS-III】例程一:认识 uC/OS-III

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

  3. NEC学习 ---- 模块 - 带点文字链接列表

    带点文字链接列表, 实现的效果是, 调整字体大小, 点的位置不会跟着变动. HTML如下: <div class="container"> <div class= ...

  4. P1026 统计单词个数

    题意 给出一段字符串和一个字典,把字符串划分为n个连续的子串,求一种最优的划分方式使字符串所含单词数最大.(详见NOIp2001) 思路 这个题是一个很典型的线性dp,难点主要在预处理上. 理解题意后 ...

  5. UML聚合与组合

    http://www.cnblogs.com/shanwenbin/archive/2012/10/24/2737229.html UML聚合与组合 2012-10-24 15:35 by DayDa ...

  6. KVC和KVO大优点

    都是动态的,运行时检查,给予了极大的方便

  7. 当html标签不被识别时(不解析)不妨试试htmlspecialchars_decode();试试

  8. 小试牛刀2:JavaScript基础题

    JavaScript基础题 1.网页中有个字符串“我有一个梦想”,使用JavaScript获取该字符串的长度,同时输出字符串最后两个字. 答案: <!DOCTYPE html PUBLIC &q ...

  9. css使input中的值自动变大写

    <style type="text/css"> input { text-transform:uppercase; } </style>

  10. web server && web framework角色区分

    问题 web framework是否包括webserver? 是否可以包括? webserver 和 framework的关系是? https://www.quora.com/What-is-the- ...