转载:一篇关于CString类型转换的文章
2007-05-16 10:02
375 查看
正在处理您的请求...
小石头的专栏
——记录成长的历程My Links
CSDN首页CSDN社区
CSDN技术中心
BLOG首页
我的首页
个人档案
联系作者
聚合
搜索
登录
Blog统计
原创 - 20翻译 - 0
转贴 - 16
点击 - 15913
评论 - 24
Trackbacks -0
公告
本人长期承接VP中小型项目及VP兼职业务。 长期承接C#,C++中小型项目。文章
asp.net2.0(RSS)c#(RSS)
fedora(RSS)
vc++(RSS)
vega prime(RSS)
XML(RSS)
随笔(RSS)
收藏
c++相册
xianglijie
http://blog.csdn.net/xianglijie/(RSS)存档
2007年03月(1)2006年08月(2)
2006年05月(2)
2006年04月(14)
2006年03月(15)
最近评论
liven:非常感谢!你这篇文章给我帮助挺大的!小石头:我们学校有,另外可以到http://www.86vr.com/的ftp去下载。下载需要发贴,积分达到方可。
lurenfu:你的vega prime是从哪儿下载的?我到网上到处搜索都找不到
作者tag:vc++ CSDN 推荐tag:函数 代码 转换 指针 软件
[align=center]<<vc6 下常见链接错误解决方法 | basic_string >>[/align]
一篇关于CString类型转换的文章
CString
因为一个MFC CString类的对象包含TCHAR类型的字符,所以确切的字符类型取决于你所定义的预处理符号。大体来说,CString 很像STL string,这意味着你必须把它当成不透明的对象,只能使用CString提供的方法来修改CString对象。CString有一个string所不具备的优点:CString具有接收MBCS和Unicode两种字符串的构造函数,它还有一个LPCTSTR转换符,所以你可以把CString对象直接传给一个接收LPCTSTR的函数而不需要调用c_str()函数。
// ConstructingCString s1 = "char string"; // construct from a LPCSTRCString s2 = L"wide char string"; // construct from a LPCWSTRCString s3 ( '' '', 100 ); // pre-allocate a 100-byte buffer, fill with spacesCString s4 = "New window text"; // You can pass a CString in place of an LPCTSTR: SetWindowText ( hwndSomeWindow, s4 ); // Or, equivalently, explicitly cast the CString: SetWindowText ( hwndSomeWindow, (LPCTSTR) s4 );
你可以从你的字符串表中装载一个字符串,CString的一个构造函数和LoadString()函数可以完成它。Format()方法能够从字符串表中随意的读取一个具有一定格式的字符串。
// Constructing/loading from string tableCString s5 ( (LPCTSTR) IDS_SOME_STR ); // load from string tableCString s6, s7; // Load from string table. s6.LoadString ( IDS_SOME_STR ); // Load printf-style format string from the string table: s7.Format ( IDS_SOME_FORMAT, "bob", nSomeStuff, ... );
第一个构造函数看起来有点奇怪,但是这实际上是文档说明的装入一个字符串的方法。 注意,对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR。 转换成LPTSTR(非常量指针)是错误的。养成把一个CString变量转换成LPTSTR的习惯将会给你带来伤害,因为当你的程序后来崩溃时,你可能 不知道为什么,因为你到处都使用同样的代码而那时它们都恰巧正常工作。正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。下 面是正确的用法的一个例子,这段代码是给一个列表控件中的项设定文字:
CString str = _T("new text");LVITEM item = {0}; item.mask = LVIF_TEXT; item.iItem = 1; item.pszText = (LPTSTR)(LPCTSTR) str; // WRONG! item.pszText = str.GetBuffer(0); // correct ListView_SetItem ( &item );str.ReleaseBuffer(); // return control of the buffer to str
pszText成员是一个LPTSTR变量,一个非常量指针,因此你需要对str调用GetBuffer()。GetBuffer()的参数是你需要 CString为缓冲区分配的最小长度。如果因为某些原因,你需要一个可修改的缓冲区来存放1K TCHARs,你需要调用GetBuffer(1024)。把0作为参数时,GetBuffer()返回的是指向字符串当前内容的指针。
上面 划线的语句可以被编译,在这种情况下,甚至可以正常起作用。但这并不意味着这行代码是正确的。通过使用非常量转换,你已经破坏了面向对象的封装,并对 CString的内部实现作了某些假定。如果你有这样的转换习惯,你终将会陷入代码崩溃的境地。你会想代码为什么不能正常工作了,因为你到处都使用同样的 代码而那些代码看起来是正确的。
你知道人们总是抱怨现在的软件的bug是多么的多吗?软件中的bug是因为程序员写了不正确的代码。难道你真的想写一些你知道是错误的代码来为所有的软件都满是bug这种认识做贡献吗?花些时间来学习使用CString的正确方法让你的代码在任何时间都正常工作把。
CString 有两个函数来从一个 CString 创建一个 BSTR。它们是 AllocSysString() 和SetSysString()。
// Converting to BSTRCString s5 = "Bob!";BSTR bs1 = NULL, bs2 = NULL; bs1 = s5.AllocSysString(); s5.SetSysString ( &bs2 ); SysFreeString ( bs1 ); SysFreeString ( bs2 );
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=653071
[收藏到我的网摘] 小石头发表于 2006年04月06日 17:22:00
相关文章:
C++字符串完全指南 - MFC类 2004-11-17 evers
CString 操作指南 2004-08-12 BestBear
C++字符串完全指引之二 —— 字符串封装类 2005-04-08 deltacat
C++字符串完全指南(2) - MFC类 2005-08-09 extcsdn
WINDOWS核心编程看书笔记(第二章) 2004-12-10 kwiner
[align=center]<<vc6 下常见链接错误解决方法 | basic_string >>[/align]
没有评论。
大名 | 请输入名字 | |
网址 | ||
评论 请输入评论 | ||
Copyright © 小石头
相关文章推荐
- 一篇关于CString类型转换的文章
- 转载关于int与string类型转换的两种方法
- 一篇文章搞定JavaScript类型转换(面试常见)
- 转载的一篇关于cap理论的不错的文章
- 转载一篇关于java内存分析的文章!
- 转载一篇关于ios静态库的文章
- 转载一篇关于国外计算机专业教育机制的文章,相比与国内教育,很有感触~
- 转载一篇关于虚拟文件系统的文章
- 转载一篇关于ALE的应用极好的文章
- 一篇挺有意思的文章 ,关于各个编程语言(转载)
- 转载一篇关于Reactor和Proactor模式的文章
- 摘要:关于VC中的数据类型转换BSTR、char*和CString的深入研究。
- 转载一篇关于Setsockopt的文章
- 关于VC中的数据类型转换BSTR、char*和CString的深入研究
- 转载一篇关于泰迪很好的文章
- 【转载】以前ioi上看到的一篇关于如何成为一名程序员的文章
- 转载一篇关于中断的文章
- 转载一篇关于ALE的应用极好的文章
- 对于上一篇文章的补充,关于String类型的比较
- 很好的一篇 关于Case When Then Else End文章,转载的。