ATL与MFC中的CString
2010-08-16 10:50
120 查看
在ATL和MFC中都可以使用CString类来处理字符串,如果在MFC中要使用ATL中的CString,需要使用名字空间ATL::CString。在书写中,可以使用CStringT,CStringA,CStringW三种格式,如果是UNICODE工程,CStringT等同于CStringW,如果是ANSI工程,CStringT等同于CStringA.下面介绍几个常用的CString使用技巧。
1.模仿.NET中的split方法
在.NET里的string类中有个split方法,即传入一个字符参数,根据这个参数来分割字符串,然后返回一个string数组。而CString 的Tokenize方法也同样可以达到这个效果。以下看示例代码
上述代码的含义,即对 videoInfo字符串以关键字'_'进行分割,然后将分割的内容传入m_list容器中,这种方法对于在ATL或者MFC中分割字符串很有帮助。
2.判断CString为空的高效方法
在程序中往往会对CString判断是否为空,方法有几种,比如GetLength()是否为零,或者直接判断是否等于_T(""),或者使用IsEmpty()方法来判断。
在实际使用时,建议使用IsEmpty()方法,其他方法可能占用线性时间。
3.和ATL的USES_CONVERSION宏配合
如果在使用A2W或者W2A方法,需要在该函数的开头使用USES_CONVERSION;宏,这样就可以很方便的在代码中转换ANSI和UNICODE,比如
USES_CONVERSION;
CStringW support;
support = A2W(Attri->Value());
其中需要说明的是,对于转换的变量,可以是一个CStringA对象,可以是一个char*指针,编译器会对上述表达进行相应的转换。
4.字符串的判断
针对两个字符串,可能存在三种情况,大于、等于、小于,Compare和CompareNoCase都可以进行字符串的判断,CompareNoCase没有进行大小写的判断。
5.在COM组件的接口传递
在COM组件中,常使用BSTR或者BSTR*来进行参数的传递,对于外部的BSTR传入,可以在CString的构造函数中承接这个BSTR,比如
STDMETHODIMP CMessageSignIn::SetUserName(BSTR pUserName)
{
CString userName(pUserName);
return S_OK;
}
在上述的函数中,构造函数承接了BSTR的参数值。
如果是想分配一个值给外部BSTR*,可以使用AllocSysString()方法
6.获取临时文件夹的路径
CStringW tmpPath;
tmpPath.GetEnvironmentVariable( _T("TEMP") );
tmpPath += _T("//UserContent.ini");
在上述方法中,GetEnvironmentVariable传入参数后,就可以获得当前临时文件夹的路径了。
1.模仿.NET中的split方法
在.NET里的string类中有个split方法,即传入一个字符参数,根据这个参数来分割字符串,然后返回一个string数组。而CString 的Tokenize方法也同样可以达到这个效果。以下看示例代码
CString resToken; CString videoInfo = _T("123_456_789"); CArray<CString,CString&> m_list; int curPos = 0; resToken= videoInfo.Tokenize(_T("_"),curPos); while (resToken != _T("")) { m_list.Add(resToken); resToken = videoInfo.Tokenize(_T("_"), curPos); }
上述代码的含义,即对 videoInfo字符串以关键字'_'进行分割,然后将分割的内容传入m_list容器中,这种方法对于在ATL或者MFC中分割字符串很有帮助。
2.判断CString为空的高效方法
在程序中往往会对CString判断是否为空,方法有几种,比如GetLength()是否为零,或者直接判断是否等于_T(""),或者使用IsEmpty()方法来判断。
在实际使用时,建议使用IsEmpty()方法,其他方法可能占用线性时间。
3.和ATL的USES_CONVERSION宏配合
如果在使用A2W或者W2A方法,需要在该函数的开头使用USES_CONVERSION;宏,这样就可以很方便的在代码中转换ANSI和UNICODE,比如
USES_CONVERSION;
CStringW support;
support = A2W(Attri->Value());
其中需要说明的是,对于转换的变量,可以是一个CStringA对象,可以是一个char*指针,编译器会对上述表达进行相应的转换。
4.字符串的判断
针对两个字符串,可能存在三种情况,大于、等于、小于,Compare和CompareNoCase都可以进行字符串的判断,CompareNoCase没有进行大小写的判断。
5.在COM组件的接口传递
在COM组件中,常使用BSTR或者BSTR*来进行参数的传递,对于外部的BSTR传入,可以在CString的构造函数中承接这个BSTR,比如
STDMETHODIMP CMessageSignIn::SetUserName(BSTR pUserName)
{
CString userName(pUserName);
return S_OK;
}
在上述的函数中,构造函数承接了BSTR的参数值。
如果是想分配一个值给外部BSTR*,可以使用AllocSysString()方法
CAtlString str(_T("This is a test string!")); BSTR bstr = str.AllocSysString(); // bstr now contains "This is a test string!", and can be // passed to any OLE function requiring a BSTR. // Normally, if you pass the BSTR, you will // need to free the string after returning from the function call.
6.获取临时文件夹的路径
CStringW tmpPath;
tmpPath.GetEnvironmentVariable( _T("TEMP") );
tmpPath += _T("//UserContent.ini");
在上述方法中,GetEnvironmentVariable传入参数后,就可以获得当前临时文件夹的路径了。
相关文章推荐
- 混用ATL MFC WTL的问题-CString的冲突
- 混用ATL MFC WTL的问题-CString的冲突
- MFC AtlMap<CString, ?>使用
- ATL and MFC String Conversion Macros(Cstring转char*)
- ATL、MFC、WTL CString 的今生前世
- ATL、MFC、WTL CString 的今生前世
- ATL、MFC、WTL CString 的今生前世
- ATL、MFC、WTL CString 的今生前世
- WTL\MFC\ATL CSTRING的前世今生
- ATL、MFC、WTL CString 的今生前世
- ATL、MFC、WTL CString 的今生前世
- MFC中CString转int/double/TCHAR*类型
- error C2440: “初始化”: 无法从“wchar_t *”转换为“ATL::CStringT<BaseType,StringTraits>”
- MFC中CString.Formmat的详细用法
- MFC,ATL,CLR简介
- MFC中CString,string,char之间的转换
- MFC Cstring 和int 类型的转化
- 在非MFC程序中引用CString
- 在非MFC程序中引用CString
- 从MFC与ATL的男女关系说起