您的位置:首页 > 其它

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方法也同样可以达到这个效果。以下看示例代码

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传入参数后,就可以获得当前临时文件夹的路径了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息