在使用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 );
}