在使用CString::GetBuffer()時遇到了一個問題,代碼如下:
Cstring sPath;
GetPrivateProfileString("Drivers","Type",sPath.GetBuffer(MAX_PATH),MAX_PATH,iniPath);
sPath.ReleaseBuffer();
int pos = sPath.Find("\\");
Cstring type = sPath.Left(pos);
經過調試,發現sPath的值爲ak\ddd.dll,pos=2,但是type的值爲ak\ddd.dll,並不是ak。
後來,將GetBuffer改爲GetBufferSetLength後沒問題了,經過查閱資料發現
1.在CString對象中,字符串的長度信息保存在一個成員變量中(假設爲m_length),需要獲取字符串長度的時候直接讀取這個值。
2.GetBuffer分配了新的內存,但不改變m_length的值;GetBufferSetLength 也分配新的內存,同時將m_length的值設置爲參數中指定的值。
3.GetCurrentDirectory方法將工作目錄的路徑直接寫入path對象的內存,m_length的值沒有改變。這時,使用GetBuffer的版本m_length值爲0,使用GetBufferSetLength的版本m_length值爲MAX_PATH。
接下來再看GetBufferSetLength方法的實現:
PXSTR GetBufferSetLength(int nLength) {
PXSTR pszBuffer = GetBuffer( nLength );
SetLength( nLength );
return( pszBuffer );
}