Невозможно скопировать данные, присутствующие в CMemFile, используя CMemFile :: Detach () - PullRequest
0 голосов
/ 28 января 2010

Я пишу две строки в памяти, используя 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 ]

1 голос
/ 28 января 2010
*pBlock = (LPTSTR) malloc(sizeof(char) * lLen);
memcpy(*pBlock, mBlock, lLen-1);

Вы, кажется, работаете со строками широких символов повсюду, но эти два вызова имеют дело с байтами. Они должны быть:

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

... хотя как отмечает Никола , вам лучше, если вы полностью избегаете память в стиле C и манипуляции со строками.

Редактировать: Что касается исключения при выполнении free(outMem); ... Я не уверен, почему даже компилирует - outMem ваш объект CMemFile, который является стек и не указатель . Вы должны делать:

free(mBlock); // release memory allocated by, but now detached from CMemFile
1 голос
/ 28 января 2010

Не нужно усложнять вещи, хранить:

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 или скрипку с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...