CString( 五 )

因此,赋值不是赋给一个 LPCTSTR 类型的变数,而且编译器无法知道如何将赋值语句右边强制转换成 LPCTSTR 。好吧,你说,那我就改成这样:tvi.item.pszText = (LPCTSTR)s; //编译器依然会报错 。编译器之所以依然报错是因为你试图把一个 LPCTSTR 类型的变数赋值给一个 LPTSTR 类型的变数,这种操作在C或C++中是被禁止的 。你不能用这种方法 来滥用常量指针与非常量指针概念,否则,会扰乱编译器的最佳化机制,使之不知如何最佳化你的程式 。比如,如果你这幺做:const int i = ...;//... do lots of stuff... = a; // usage 1// ... lots more stuff... = a; // usage 2那幺,编译器会以为既然 i 是 const ,所以 usage1和usage2的值是相同的,并且它甚至能事先计算好 usage1 处的 a 的地址,然后保留着在后面的 usage2 处使用,而不是重新计算 。如果你按如下方式写的话:const int i = ...;int * p = &i;//... do lots of stuff... = a; // usage 1// ... lots more stuff(*p)++; // mess over compilers assumption// ... and other stuff... = a; // usage 2编译器将认为 i 是常量,从而 a 的位置也是常量,这样间接地破坏了先前的假设 。因此,你的程式将会在 debug 编译模式(没有最佳化)和 release 编译模式(完全最佳化)中反映出不同的行为,这种情况可不好,所以当你试图把指向 i 的指针赋值给一个 可修改的引用时,会被编译器诊断为这是一种伪造 。这就是为什幺(LPCTSTR)强制类型转化不起作用的原因 。为什幺不把该成员声明成 LPCTSTR 类型呢?因为这个结构被用于读写控制项 。当你向控制项写数据时,文本指针实际上被当成 LPCTSTR,而当你从控制项读数据 时,你必须有一个可写的字元串 。这个结构无法区分它是用来读还是用来写 。因此,你会常常在我的代码中看到如下的用法:tvi.item.pszText = (LPTSTR)(LPCTSTR)s;它把 CString 强制类型转化成 LPCTSTR,也就是说先获得改字元串的地址,然后再强制类型转化成 LPTSTR,以便可以对之进行赋值操作 。注意这只有在使用 Set 或 Insert 之类的方法才有效!如果你试图获取数据,则不能这幺做 。如果你打算获取存储在控制项中的数据,则方法稍有不同,例如,对某个 CTreeCtrl 使用 GetItem 方法,我想获取项目的文本 。我知道这些 文本的长度不会超过 MY_LIMIT,因此我可以这样写:TⅥTEM tvi;// ... assorted initialization of other fields of tvitvi.pszText = s.GetBuffer(MY_LIMIT);tvi.cchTextMax = MY_LIMIT;c_MyTree.GetItem(&tvi);s.ReleaseBuffer();可以看出来,其实上面的代码对所有类型的 Set 方法都适用,但是并不需要这幺做,因为所有的类 Set 方法(包括 Insert方法)不会改变字元串的内容 。但是当你需要写 CString 对象时,必须保证缓冲是可写的,这正是 GetBuffer 所做的事情 。再次强调:一旦做了一次 GetBuffer 调用,那幺在调用 ReleaseBuffer 之前不要对这个 CString 对象做任何操作 。BSTR 型转换CString型转为BSTR当我们使用 ActiveX 控制项编程时,经常需要用到将某个值表示成 BSTR 类型 。BSTR 是一种记数字元串,Intel平台上的宽字元串(Unicode),并且 可以包含嵌入的 NULL 字元 。你可以调用 CString 对象的 AllocSysString 方法将 CString 转化成 BSTR:CString s;s = ... ; // whateverBSTR b = s.AllocSysString();现指针b 指向的就是一个新分配的 BSTR 对象,该对象是 CString 的一个拷贝,包含终结 NULL字元 。你可以将它传递给任何需要 BSTR 的接口 。通常,BSTR 由接收它的组件来释放,如果你需要自己释放 BSTR 的话,可以这幺做:::SysFreeString(b);对于如何表示传递给 ActiveX 控制项的字元串,在微软内部曾一度争论不休,最后 Visual Basic 的人占了上风,BSTR("Basic String"的首字母缩写)就是这场争论的结果 。BSTR 型转为CString由于 BSTR 是记数 Unicode 字元串,你可以用标準转换方法来创建 8 位的 CString 。实际上,这是 CString 内建的功能 。在 CString 中 有特殊的构造函式可以把 ANSI 转化成 Unicode,也可以把Unicode 转化成 ANSI 。你同样可以从 VARIANT 类型的变数中获得 BSTR 类型的字元串,VARIANT 类型是 由各种 COM 和 Automation (自动化)调用返回的类型 。例如,在一个ANSI程式中:BSTR b;b = ...; // whateverCString s(b == NULL L"" : b)