Bonjour,

J'ai un projet qui a été écrit et compilé en version antérieur à Visual Studio 2005 et qui fonctionnait très bien. Ce programme fournit une dll. Depuis que ce projet a été compilé avec Visual Studio 2005 il ne fonctionne plus et envoi des messages à tout va pour des violations d'accès en lecture écriture. J'insiste sur le changement de compilateur. Je donne ici peut être l'un des problèmes le plus basic dans la fonction suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
bool ACG_IMPORT WORD97_ChangeString(ObCharFld &RS, ObCharFld &OldHeader, ObCharFld &OldSeparator, ObCharFld &NewHeader, ObCharFld &NewSeparator) 
{
  int len_olds;
  int len_newh = 10240;
  int len_news;
  int n;
 
  char *oldh = OldHeader.GetText();
  char *olds = OldSeparator.GetText();  
  char *newh;
  char news[128];
 
  if (!Is_FCT_loaded(Convert))
    Convert = (TConvert)GetProcAddress(word_hm, "Convert");
  if (!Is_FCT_loaded_Msg(Convert))
    return (false);
 
  /* verification des parametres pour eviter un SEGVIO */
  if (!NewSeparator.GetText() || !oldh || !olds || (len_olds = strlen(olds)) == 0 || (len_news = Convert(news, NewSeparator.GetText())) == 0 || 
    strncmp(oldh, olds, len_olds)) 
   {
     RS.SetText("ERR");
     return false;
   }
 
  oldh += len_olds; // suppression du separateur en debut de chaine
 
  /* allocation d'une chaine pour le nouvel header */
  newh = new char [len_newh];
  n = 0;
  newh[n++] = '\"';
 
  while (*oldh)
    {
      if (!strncmp(oldh, olds, len_olds))
        {
	  /* C'est un separateur => remplacer par le nouveau separateur */
	  strcpy_s(&newh[n], len_newh, news); /* remplace par le nouveau separateur */
	  while (newh[n]) n++; /* se positionne a la fin */
	    oldh += len_olds; /* deplacement dans la chaine */
	}
        else
	  /* C'est un caractere comme un autre */
	  newh[n++] = *oldh++;
      /* petit test pour eviter que le buffer soit trop petit */
      if (n >= len_newh - len_news - 1)
        {
	  char *tmp;
	  int new_len;
          new_len = len_newh * 2;
          tmp = new char [new_len];
	  memcpy(tmp, newh, len_newh);
	  newh = tmp;
	  len_newh = new_len;
       }
    }
 
  /* fermeture du nouvel header */
  newh[n++] = '\"';
  newh[n] = '\0';
 
  NewHeader.SetText(newh);
  RS.SetText(" ");
  return true;
}
Tout se passe bien lors du premier appel à cette fonction, mais ça se plante donc par une vilation d'accès lors du deuxième appel sur la ligne de code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
newh = new char [len_newh];
Le fait de rajouter en fin de fonction le code
fait que ça se plante lors du premier appel à cette fonction et sur cette ligne ajoutée...

D'avance merci pour vos solutions