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

}