`
wsql
  • 浏览: 11786521 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

LPTSTR、LPCSTR、LPCTSTR、LPSTR之间的转换

 
阅读更多

如何理解LPCTSTR类型?

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;

分享到:
评论

相关推荐

    LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别

    LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别; ANSI和UNICODE的使用; Unicode宽字符转化; VC中的字符串类型和处理函数;

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

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

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

    LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义

    (资料大全加程序)C++ 字符串之间的相互转化 宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR)

    资料大全加程序 宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR) C++ 字符串之间的相互转化

    CString、LPCTSTR、LPTSTR、TCHAR、WCHAR、string、wchar_t、char解析

    CString、LPCTSTR、LPTSTR、TCHAR、WCHAR、string、wchar_t、char解析 CString、LPCTSTR、LPTSTR、TCHAR、WCHAR、string、wchar_t、char解析 CString、LPCTSTR、LPTSTR、TCHAR、WCHAR、string、wchar_t、char解析

    LPSTR、LPTSTR等类型来源及意义详述

    介绍Unicode,ANSI来源,说明LPTSTR、LPSTR等的来源和意义,阅读后会对几种类型认识更详细。适用初学者。

    VC++对字符串处理

    VC++ MFC里定义了一些宏,例如LPCTSTR表示const TCHAR*,LPTSTR表示TCHAR*,LPSTR表示char*,LPWSTR表示wchar_t*,LPCSTR表示const char*,LPCWSTR表示const wchar_t*。总之就是LP表示指针,C表示const,STR表示char...

    vc数据类型转换详细说明

    使用Visual C++编程时,数据类型转换是很头疼的事情,特别是在Visual Stdio 2010中使用Unicode字符串的转换令人困惑,例如(LPTSTR)(LPCTSTR)CString 转化为LPCTSTR,附件是本人利用网上资源整理的vc数据类型转换说明...

    C++类型转换

    LPCTSTR 32-bit指针,指向一个常数字符串,此字符串可移植到Unicode和DBCS(双字节字集) LPTSTR 32-bit指针,指向一个字符串,此字符串可移植到Unicode和DBCS(双字节字集) LPCSTR 32-bit指针,指向一个常数...

    Wince 注册表基本操作封装类

    BOOL GetValueSZ(LPCTSTR szName, LPTSTR szValue, DWORD dwLen); //枚举键值 BOOL EnumValue(LPTSTR pszName, DWORD dwLenName, LPTSTR pszValue, DWORD dwLenValue); BOOL EnumKey(LPTSTR psz, DWORD dwLen); //...

    INI文件解析C++的两种实现

    在Window中可以使用其API来对ini文件操作,但在WinCE, Linux 中并没有提供这种API, 为了达到接口的一致性, 我们可以自己实现, 这里是C++实现的两中实现, 大家共同学习, 同时也赚些资源分,谢谢

    c++字符转换

    c++中字符转换的用法 (1)直接赋值  CString strText;  LPTSTR lpszText = _T("LPTSTR >> CString");  strText = lpszText;  ::MessageBox( NULL, strText , _T("标题"),

    BSTR详解五

    BSTR详解五 - BSTR与其它字符串类型转换 ...LPCTSTR sz1 = _T("Test String"); BSTR bs = ::SysAllocString(sz1); … ::SysFreeString(); Wrong: LPTSTR sz1 = _T("Test String"); BSTR bs = sz1; //ERROR

    MFC执行DOS去掉黑框取得DOS命令结果

    #define DOS_CMD (LPTSTR)(LPCTSTR)DosString SECURITY_ATTRIBUTES sa; HANDLE hRead, hWrite; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if ...

    019-兼容型字符串(TCHAR)及相关函数.flv

    //郁金香灬老师 ...LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义 LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义 ---------------------

    内存加载dll

    HMEMORYRSRC MemoryFindResourceEx(HMEMORYMODULE, LPCTSTR, LPCTSTR, WORD); /** * Get the size of the resource in bytes. */ DWORD MemorySizeofResource(HMEMORYMODULE, HMEMORYRSRC); /** * Get a ...

    在evc中读写ini文件

    LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName ) { CFile iniFile; PBYTE pFileBuf; CString szBuf; DWORD dwLength; if (lpFileName == NULL || lpReturnedString == NULL) return 0...

    mfc皮肤轻松换肤 告别复杂

    skinppLoadSkin((LPTSTR)(LPCTSTR)cmdline); } else { skinppLoadSkin(_T("skin\\XP-Metallic.ssk")); } 其中: skinppLoadSkin(_T("skin\\XP-Metallic.ssk"));用于加载皮肤,根据你皮肤的位置改变路径

    windows字符串的前世今生

    CString、LPCTSTR、LPTSTR、TCHAR、WCHAR、string、wchar_t、char各种类型的转发与字符集的发展演变,通过思维导图清晰表示他们之间的关系,让初学者摆脱windows编程,常常遇到的的字符集的困惑。

    abc.rar_ABC_BOOL CreateProcess_CreateProcess

    通过函数 BOOL CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD ...

Global site tag (gtag.js) - Google Analytics