CORRECTIF : Vous rencontrer une violation d'accès lorsque vous sérialisez une Unicode CString dans Visual C++ 6.0

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

La version anglaise de cet article est la suivante: 193100
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Symptômes
Lorsque sérialisation dans une Unicode CString dans une MFC MBCS application ou vice versa, CString du fichier est en lecture, converti en une CString du type de build, et CString d'origine est supprimé. Lors de la suppression de CString d'origine, il se peut que vous constatiez une violation d'accès ou une erreur de page non valide. Le code de problème est de ligne 270 dans Arccore.cpp. Les symptômes décrits ici sont évidents dans les versions release.
Cause
CString dans la version Release utilise son propre gestionnaire de mémoire (classe CFixedAlloc) pour les chaînes de taille moins de 512 octets. Par conséquent, pour tous les CString (de moins de 512 octets) allocations effectuées par CFixedAlloc::Alloc() via CString::AllocBuffer() et désallocations correspondantes sont effectuées par CFixedAlloc::Free via CString::FreeData(). Dans l'opérateur de fonction de sérialisation de CString :

>> (CArchive& ar, CString& string)				


au lieu d'appeler CString::FreeData() pour libérer les données, l'opérateur delete est appelée, et cela peut provoquer le problème mentionnée ci-dessus.
Résolution
Modifier ligne 270 dans Arccore.cpp dans la liste suivante :
delete[] (BYTE*)pOldData;				
à la suivante :
CString::FreeData(pOldData);				
reconstruire les bibliothèques MFC et lier statiquement à elle. La commande suivante crée la bibliothèque MFC débogage sans informations CodeView (NAFXCWD.lib) :
DÉBOGAGE DE NMAKE = 1 CODEVIEW = 0
Pour obtenir plus d'informations sur la création d'une variante de bibliothèque de liaisons statiques peut être obtenu à partir du fichier Lisezmoi.txt fourni avec Visual C++ ou dans xxxx\MFC\SRC\README.TXT (où xxxx est le nom de répertoire pour Visual C++ produit ; par défaut, C:\Program Files\Microsoft Visual Studio\VC98 pour Visual C++ version 6.0). La marque fichier existe dans le même répertoire et est nommé MAKEFILE.

Remarque Vous pouvez modifier la source, régénérez une version DLL de MFC bibliothèque. Toutefois, vous pouvez redistribuer une vente au détail (/Release) de votre bibliothèque modifié uniquement si vous le renommez à un élément other than MFCxx.dll. Vous ne pouvez pas redistribuer la version debug de la prédéfinis ou personnalisés intégrés débogage DLL. Veuillez vous reporter à "MFC Technical Note 33" pour plus d'informations.
Statut
Microsoft a confirmé l'existence de ce bogue dans les produits Microsoft répertoriés dans la section "S'applique à".Ce bogue a été corrigé dans Visual Studio 6.0 Service Pack 1.

Pour obtenir ce service pack, reportez-vous au site Web de MSDN (Microsoft Developer Network) à l'adresse suivante :Pour plus d'informations sur Visual Studio 6.0 Service Pack 1, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la base de connaissances Microsoft :
193009Lisezmoi de Visual Studio 6.0 Service Pack 1
194022Visual Studio 6.0 service packs, quoi, où, pourquoi
194295Comment faire pour savoir qu'un service pack Visual Studio est installé
Plus d'informations
La pile des appels lorsque se produit la violation d'accès doit ressembler à ce qui suit :
   HeapFree(...)   free(...)   operator delete(...)   operator>>(CArchive &, CString &)				
(c) 1999 Microsoft Corporation, tous droits réservés. Contribution Jaganathan Thangavelu, Microsoft Corporation.

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 193100 - Dernière mise à jour : 02/22/2014 17:42:01 - Révision : 6.2

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbqfe kbbug kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193100 KbMtfr
Commentaires