2010-01-28 2 views
0

Je vous écris deux lignes en mémoire à l'aide CMemFile::Write():Impossible de copier les données présentes dans CMemFile en utilisant CMemFile :: Détacher()

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); 
} 

La fenêtre de sortie affiche la chaîne « EMPID EmpNam ?????? ?? ????????? " lorsque le OutputDebugStringW (* pBlock); L'instruction est exécutée.

Je ne comprends pas pourquoi les données sont tronquées. En outre, le système lève une exception non gérée lorsque l'instruction est libre (outMem); est exécuté.

Quelqu'un peut-il me guider s'il vous plaît à la solution et laissez-moi savoir où je me trompe?

Merci.

Répondre

1

Pas besoin de compliquer les choses, pour stocker:

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(); 

Pour charger:

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

CString temp; 
archive >> temp; 

Pas besoin d'utiliser memcpy ou jouer avec la mémoire.

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

Vous semblez travailler avec des chaînes de caractères larges partout ailleurs, mais ces deux appels traitent avec des octets. Ils devraient être:

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

... si as Nikola notes, vous êtes mieux si vous évitez la mémoire de type C et entièrement manipulation de chaînes.

Edit: Quant à l'exception lors de l'exécution free(outMem); ... Je ne sais pas pourquoi que même compile-outMem est votre objet CMemFile, qui est pile alloué et pas un pointeur. Vous devriez faire:

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

Je l'ai essayé mais j'ai obtenu la même exception. – user196614

+0

Je crois que c'est parce que '(* pBlock) [lLen -1] = 0;' doit également être mis à jour pour gérer le décalage de taille tchar '(* pBlock) [lLen * sizeof (TCHAR)] = 0;' – Ruddy

+0

@ Ruddy: Je ne pense pas ... 'pBlock' est de type' TCHAR ** ', donc un index appliqué à' (* bBlock) 'sera un index dans un tableau de' TCHAR's. Notez que s'il s'agissait en fait d'un tableau d'octets, vous devez tout d'abord le convertir en un tableau TCHAR afin de définir un terminateur NULL à deux octets! @unknown: J'ai manqué cette nuit dernière, mais ... Vous êtes 'libre()' ne pas avoir le bon objet! Voir mon edit ... – Shog9

Questions connexes