好久没有写。。TMD碰到大坑,实在忍不住吐槽前任。
碰到了白痴写的代码如下:
CString strGet,strKey;
strGet.Empty();
strKey = _T("Mode");
GetPrivateProfileString(_T("COMM"),strKey,_T("default"),strGet.GetBuffer(512),512,strConfigFilePath);
m_strCommMode = strGet;
strKey = _T("Serial");
GetPrivateProfileString(_T("COMM"),strKey,_T("default"),strGet.GetBuffer(512),512,strConfigFilePath);
......
觉得万般别扭,果然在我后来调试时,发现了问题:
m_strCommMode 中明明有值,但GetLength为何返回0, IsEmpty 为何是TRUE?
因是生产环境,就 MessageBox/写日志查看里面的值,发现都是正常,但TMD,GetLength为何总返回0, IsEmpty 为何总是TRUE?
单步调试后,才发现问题就是上面的GetBuffer()出现了问题,记住了:蛋炒饭必须要用隔夜饭炒,CString的GetBuffer也必须要和ReleaseBuffer配对使用!!!!!理由如下:
我们来看看MFC中ReleaseBuffer的代码:
void ReleaseBuffer( int nNewLength = -1 )
{
if( nNewLength == -1 )
{
nNewLength = StringLength( m_pszData );
}
SetLength( nNewLength );
}
很明显ReleaseBuffer只有一个作用,就是更新字符串的长度。CString内,GetLength获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CString时,那个int变量并不可能自动更新,于是便有了ReleaseBuffer。
因此以上代码加上s.ReleaseBuffer();后再s.GetLength()就OK了。
最后,或许是洁癖,实在忍不住,按我自己的套路来改写了一下: 明明可以不用CString的啊!!
TCHAR szTemp[512];
memset( szTemp, 0, sizeof(szTemp) );
GetPrivateProfileString(_T("COMM"),_T("Mode"),_T("COM"), szTemp,512,strConfigFilePath);
m_strCommMode = szTemp;
m_nCommPort = GetPrivateProfileInt(_T("COMM"),_T("Serial"), 0, 512,strConfigFilePath);