我在调用一个DLL函数时,传入一个CString的指针(通过GetBuffer得到)参数,在DLL中对这个指针还追加了几个字符,然后调用返回之后,在调用ReleaseBuffer出错如下:
void CString::ReleaseBuffer(int nNewLength)
{
CopyBeforeWrite(); // just in case GetBuffer was not called if (nNewLength == -1)
nNewLength = lstrlen(m_pchData); // zero terminated ASSERT(nNewLength <= GetData()->nAllocLength);
GetData()->nDataLength = nNewLength;
m_pchData[nNewLength] = '\0';
}
在ASSERT(nNewLength <= GetData()->nAllocLength);出错
并显示memory error如下:
memory check error at 0x00911AD3 = 0x6F, should be 0xFD.
memory check error at 0x00911AD4 = 0x6E, should be 0xFD.
memory check error at 0x00911AD5 = 0x74, should be 0xFD.
memory check error at 0x00911AD6 = 0x65, should be 0xFD.
调用函数为
nRet = ExtraApi(strSaveFilePath.GetBuffer(0),NULL,FALSE);
strSaveFilePath.ReleaseBuffer();
ExtraApi原型为:
int ExtraApi(LPSTR lpszExtractDir, PROCESSPROClpfnProcessProc,BOOL buztoorgdir = TRUE);
在DLL的这个函数中对strSaveFilePath所指的指针使用了strcat追加了一个字符串!
现在的问题已经知道是strSaveFilePath.ReleaseBuffer()时没有释放调追加的这个字符串,问题是如何在不改动DLL中函数,加以解决!!!
void CString::ReleaseBuffer(int nNewLength)
{
CopyBeforeWrite(); // just in case GetBuffer was not called if (nNewLength == -1)
nNewLength = lstrlen(m_pchData); // zero terminated ASSERT(nNewLength <= GetData()->nAllocLength);
GetData()->nDataLength = nNewLength;
m_pchData[nNewLength] = '\0';
}
在ASSERT(nNewLength <= GetData()->nAllocLength);出错
并显示memory error如下:
memory check error at 0x00911AD3 = 0x6F, should be 0xFD.
memory check error at 0x00911AD4 = 0x6E, should be 0xFD.
memory check error at 0x00911AD5 = 0x74, should be 0xFD.
memory check error at 0x00911AD6 = 0x65, should be 0xFD.
调用函数为
nRet = ExtraApi(strSaveFilePath.GetBuffer(0),NULL,FALSE);
strSaveFilePath.ReleaseBuffer();
ExtraApi原型为:
int ExtraApi(LPSTR lpszExtractDir, PROCESSPROClpfnProcessProc,BOOL buztoorgdir = TRUE);
在DLL的这个函数中对strSaveFilePath所指的指针使用了strcat追加了一个字符串!
现在的问题已经知道是strSaveFilePath.ReleaseBuffer()时没有释放调追加的这个字符串,问题是如何在不改动DLL中函数,加以解决!!!
strSaveFilePath.ReleaseBuffer();
===============================
nRet = ExtraApi(strSaveFilePath.GetBuffer(strSaveFilePath.GetLenght()),NULL,FALSE);
strSaveFilePath.ReleaseBuffer();
C:\Documents and Settings\桌面\
调用之后为:
C:\Documents and Settings\桌面\content.pdf
content.pdf 为DLL中追加的内容!
ReleaseBuffer时nNewLength 为“C:\Documents and Settings\桌面\content.pdf ”的长度,
而GetData()->nAllocLength 为“C:\Documents and Settings\桌面\”的长度,固有以下的Assert
ASSERT(nNewLength <= GetData()->nAllocLength);
(2) str.LockBuffer();
(3) CString temp = str;
(4) str.UnlockBuffer();
(5) str.LockBuffer();
(6) str = "error";
(7) str.ReleaseBuffer();
CString strCommandLine = TEXT("D:\\MyPlayer.exe ") + TEXT(str);
LPTSTR szCommandLine = new TCHAR[strCommandLine.GetLength()+1];
_tcscpy(szCommandLine, strCommandLine);
CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);