我在调用一个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中函数,加以解决!!!

解决方案 »

  1.   

    nRet = ExtraApi(strSaveFilePath.GetBuffer(0),NULL,FALSE);
    strSaveFilePath.ReleaseBuffer();
    ===============================
    nRet = ExtraApi(strSaveFilePath.GetBuffer(strSaveFilePath.GetLenght()),NULL,FALSE);
    strSaveFilePath.ReleaseBuffer();
      

  2.   

    不行,例如:调用DLL之前strSaveFilePath为:
    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);
      

  3.   

    谁能详细讲以下void CString::ReleaseBuffer(int nNewLength)的具体工程??
      

  4.   

    (1)   CString str("test");
       (2)   str.LockBuffer();
       (3)   CString temp = str;
       (4)   str.UnlockBuffer();
       (5)   str.LockBuffer();
       (6)   str = "error";
       (7)   str.ReleaseBuffer();
      

  5.   

    参考:
    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);