Я пишу две строки в памяти с помощью CMemFile::Write()
:Невозможно скопировать данные, присутствующие в CMemFile с помощью CMemFile :: Detach()
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); Выполняется инструкция.
Я не понимаю, почему данные усечены.
Кроме того, система выдает необработанное исключение, если оператор свободен (outMem);.
Может кто-нибудь, пожалуйста, направит меня к решению и сообщите мне, где я ошибаюсь?
Спасибо.
Я попробовал, но получил то же исключение. – user196614
Я считаю, что потому, что '(* pBlock) [lLen -1] = 0;' также необходимо обновить, чтобы обрабатывать смещение размера tchar '(* pBlock) [lLen * sizeof (TCHAR)] = 0;' – Ruddy
@ Ruddy: Я так не думаю ... 'pBlock' имеет тип' TCHAR ** ', поэтому индекс, примененный к' (* bBlock) ', будет индексом в массив' TCHAR'. Обратите внимание, что если это был фактически массив байтов, вам нужно было бы сначала передать его в массив TCHAR, чтобы установить двухбайтовый NULL-терминатор! @unknown: я пропустил это прошлой ночью, но ... Ты свободен(), ошибаясь! См. Мое редактирование ... – Shog9