无法使用CMemFile :: Detach()复制CMemFile中存在的数据

时间:2010-01-28 09:17:40

标签: c++ mfc visual-c++

我使用CMemFile::Write()在内存中写两行:

void CLISTCTRLDlg::Export(LPTSTR *pBlock)
{
 CMemFile outMem(32768);

 CString csHeader = _T("EmpId EmpName EmpAddress\n");
 outMem.Write(csHeader.GetBuffer(0), csHeader.GetLength());

 CString csInfo = _T("1 TestName TestAddress\n");
 outMem.Write(csInfo.GetBuffer(0), csInfo.GetLength());

 long lLen = outMem.GetLength() + 1;
 BYTE *mBlock = outMem.Detach();
 *pBlock = (LPTSTR) malloc(sizeof(char) * lLen);
 memcpy(*pBlock, mBlock, lLen-1);
 (*pBlock)[lLen -1] = 0;
 OutputDebugStringW(*pBlock);
 free(outMem);
}

输出窗口显示字符串“EmpId EmpNam??????????????????”当执行 OutputDebugStringW(* pBlock); 语句时。

我不明白为什么数据会被截断。

此外,当执行语句 free(outMem); 时,系统抛出未处理的异常。

任何人都可以指导我解决方案并让我知道我错在哪里吗?

感谢。

2 个答案:

答案 0 :(得分:1)

无需复杂化,存储:

CMemFile file;
CArchive archive(&file, CArchive::store);

CString csHeader = _T("EmpId EmpName EmpAddress\n");
archive << csHeader;

CString csInfo = _T("1 TestName TestAddress\n");
archve << csInfo;

archive.Close();

加载:

file.Seek(0, 0); // rewind the file
CArchive archive(&file, CArchive::load);

CString temp;
archive >> temp;

无需使用memcpy或拨弄内存。

答案 1 :(得分:1)

*pBlock = (LPTSTR) malloc(sizeof(char) * lLen);
memcpy(*pBlock, mBlock, lLen-1);

您似乎在其他地方使用宽字符字符串,但这两个调用处理字节。他们应该是:

 *pBlock = (LPTSTR) malloc(sizeof(TCHAR) * lLen);
 memcpy(*pBlock, mBlock, sizeof(TCHAR) * (lLen-1));

......虽然as Nikola notes,如果你完全避免使用C风格的内存和字符串操作,你会更好。

编辑:执行free(outMem);时的异常...我不确定为什么即使编译 - outMem也是你的CMemFile对象,它是堆栈分配的,不是指针。你应该这样做:

free(mBlock); // release memory allocated by, but now detached from CMemFile