景德镇网站制作公司,浦东新区网站推广公司,个人网站方案建设书,域名和网站建设CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换#xff0c;没什么奇特的#xff0c;最简单的C操作符重载而已。常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T( abcd )时#xff0c; 字符串 abcd 就会根…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(LHELLO);通常这样做都比较能解决问题。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 *LPTSTRLPSTR、LPWSTR两者二选一取决于是否宏定义了UNICODE或ANSILPCTSTR LPCSTR、LPCWSTR两者二选一取决于是否宏定义了UNICODE或ANSI如下是从MFC库中拷来的#ifdef UNICODEtypedef LPWSTR LPTSTR;typedef LPCWSTR LPCTSTR;#elsetypedef LPSTR LPTSTR;typedef LPCSTR LPCTSTR;#endif3、相互转换方法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 )也可将单字节字符数组指针转为双字节字符数组指针还没怎么没用到过。