好久沒有寫。。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);