IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi .NET Discussion :

convertion de string -> AccessViolationException


Sujet :

Delphi .NET

  1. #1
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut convertion de string -> AccessViolationException
    Bonjour,

    Je mets un sujet là-dessus parce que ça fait des mois que je trouve des AccesViolationException avec le message: "Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée." dans une application un peu "stressée" sans savoir pourquoi.

    Après avoir enfin réussi à reproduire, j'ai le message "erreur de vérification étendue" lorsque l'exception est levée en mode debug.

    Je viens de trouver que cela provient d'un problème de conversion entre des System.string (type .NET 2) et Borland.Delphi.System.String (type Delphi).

    Je suis sous Rad Studio Delphi 2007.

    je déclare mes string de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var s : string;
        obj : TObject; // ou obj : &Object;
    L'exception AccessViolationException est levée lorsque je faisLa raison est que s est un Borland.Delphi.System.String alors que ToString renvoie un System.string.

    Et des ToString (ou d'autres fonctions .NET qui renvoient des System.String), il y en a beaucoup sur des Dataset ou autres objets .NET dans l'application que je gère.

    La solution à ce problème est d'éviter le ToString si possible ou d'utiliser System.String à la place de string dans la déclaration (non testé pour l'instant).


    Je ne sais pas si ça vaut une faq ou quoi mais je pense que ça a le mérite d'être au moins mis sur le forum.

    Cordialement,
    Arnaud DANEELS
    --
    Arnaud DANEELS

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par adaneels
    Je viens de trouver que cela provient d'un problème de conversion entre des System.string (type .NET 2) et Borland.Delphi.System.String (type Delphi).
    Il s'agit de la même chose, le String est mappé sur System.String. Ce qui est ajouté c'est juste un class helper sur TObject.

    Le code suivant ne provoque aucune erreur :
    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
     
    program Project2;
    {$APPTYPE CONSOLE}
    {$R+} // ou {$R-}
    uses
      SysUtils;
    var s : System.String;
         // ou s : String;
        obj : TObject;
        obj2 : &Object;
    begin
      try
      s:='test';
      obj:=TObject.Create;
      obj2:=&Object.Create;
      Writeln('Type');
      Writeln(S.GetType);
      Writeln((Obj.tostring).GetType);
      Writeln('Contenu');
      Writeln(S);
      Writeln(Obj.tostring);
      Writeln(Obj2.tostring);
      S:=Obj.tostring;
      Writeln(S);
      S:=Obj2.tostring;
      Writeln(S);
      Readln;
      except
        on E:Exception do
          Writeln(E.Classname, ': ', E.Message);
      end;
    end.
    Je doute de l'explication concernant la cause du pb que tu rencontres
    D2007 patché, XP Sp2, Fx 2.0 patché

  3. #3
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Salut,

    Il s'agit de la même chose, le String est mappé sur System.String. Ce qui est ajouté c'est juste un class helper sur TObject.

    Le code suivant ne provoque aucune erreur :
    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
     
    program Project2;
    {$APPTYPE CONSOLE}
    {$R+} // ou {$R-}
    uses
      SysUtils;
    var s : System.String;
         // ou s : String;
        obj : TObject;
        obj2 : &Object;
    begin
      try
      s:='test';
      obj:=TObject.Create;
      obj2:=&Object.Create;
      Writeln('Type');
      Writeln(S.GetType);
      Writeln((Obj.tostring).GetType);
      Writeln('Contenu');
      Writeln(S);
      Writeln(Obj.tostring);
      Writeln(Obj2.tostring);
      S:=Obj.tostring;
      Writeln(S);
      S:=Obj2.tostring;
      Writeln(S);
      Readln;
      except
        on E:Exception do
          Writeln(E.Classname, ': ', E.Message);
      end;
    end.
    Je doute de l'explication concernant la cause du pb que tu rencontres
    D2007 patché, XP Sp2, Fx 2.0 patché
    Merci, vos conseils sont toujours aussi utiles !

    J'ai commencé à utiliser partout le même type mais la décision de refondre la solution en C# a été prise donc on stabilise et on recommence.

    Va vraiment falloir que j'écrive les articles que je m'étais noté sur des coins de feuilles parce que je risque fort d'avoir la tête plongée dans d'autres langages prochainement !

    3ème application Delphi à laquelle je participe à une refonte en C#... mais c'est un autre débat.

    J'y regarderai de plus près tout de même pour ma connaissance perso.
    Merci.

    ---

    Pour plus de détails sur le problème, c'est assez ardu :
    J'ai eu ces violations d'accès sur des string, j'ai commencé à épurer le code correspondant. Au final, j'ai des violations d'accès sur la méthode TAdoDbxCommand.executereader, avec une requête qui fonctionne parfaitement. En fait, c'était du à une gestion des connexions à la base de données (très) mal pensée (ou bien pensée s'il on ne faisait qu'une dizaine de connexions).

    Une fois la gestion de connexion vite modifiée, je n'ai plus de violations d'accès, même en remettant le code comme avant où j'avais des string qui ne se convertissaient pas.

    Le rapport entre ça et les violations d'accès sur des strings ?
    Je n'en sais rien, même en essayant de regarder les adresses des mémoires allouées, je n'ai pas réussi à voir (mais je n'y ai pas passé des heures).

    L'explication : j'en ai aucune. Ça vient certainement du code source que l'on a écrit mais je ne comprends toujours pas pourquoi ça a lancé des violations d'accès lorsque l'on fait une conversion implicite sur des types qui sont, comme vous dites, identiques.

    Je regarderai plus en détail la semaine prochaine.
    Si je trouve quelque chose, je le mettrai ici.

    Merci encore,
    Arnaud Daneels
    --
    Arnaud DANEELS

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adaneels
    3ème application Delphi à laquelle je participe à une refonte en C#... mais c'est un autre débat.
    La décision clôt le débat
    Citation Envoyé par adaneels
    Le rapport entre ça et les violations d'accès sur des strings ?
    Je n'en sais rien, même en essayant de regarder les adresses des mémoires allouées,
    Ceci me semble être une démarche incorrecte sous .NET puisque le garbage collector peut être amenné à déplacer les objets lors d'une collecte.
    L'analyse de la pile d'appel de l'exception ne donne rien ?
    Citation Envoyé par adaneels
    Le rapport entre ça et les violations d'accès sur des strings ?
    Il y a peut être un mixte de code Win32 et .NET, ou des options de compilation qui pose pb, voir la présence de code Unsafe...
    Citation Envoyé par adaneels
    sur des types qui sont, comme vous dites, identiques.
    C'est surtout le compilateur (compatible CLS) qui le dit et s'il en existait un de différent on devrait le retrouver dans le code source de Delphi .NET.

  5. #5
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Ceci me semble être une démarche incorrecte sous .NET puisque le garbage collector peut être amenné à déplacer les objets lors d'une collecte.
    L'analyse de la pile d'appel de l'exception ne donne rien ?
    Je regarde toujours la pile d'appel (et les innerexceptions), rien qui m'a marqué et dont je me souvienne. Je regarderai. (ne pas hésiter à faire un message s'il vous semble que j'oublie ).

    Citation Envoyé par Laurent Dardenne Voir le message
    Il y a peut être un mixte de code Win32 et .NET, ou des options de compilation qui pose pb, voir la présence de code Unsafe...
    Un mixte de code Win32 et .NET : oui, il y a un peu de Win32
    options de compilation qui pose pb : c'est possible, je ne parierai pas une caisse de Petrus vielle brune que tout est parfait de ce côté là.
    code unsafe : non

    Citation Envoyé par Laurent Dardenne Voir le message
    C'est surtout le compilateur (compatible CLS) qui le dit et s'il en existait un de différent on devrait le retrouver dans le code source de Delphi .NET.
    ok

    je reprends le message prochainement avec plus de réponses.


    Nota Bene : "Vir bonus est is, qui prodest quibus potest, nocet nemini"
    --
    Arnaud DANEELS

Discussions similaires

  1. convertion Double -> String
    Par laurent.c123 dans le forum Langage
    Réponses: 4
    Dernier message: 03/07/2007, 15h08
  2. hql: convertion de string en date
    Par osoumayaj dans le forum Hibernate
    Réponses: 3
    Dernier message: 04/01/2007, 13h17
  3. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  4. [Kylix] Error converting locale string
    Par BONNEFOI Patrick dans le forum EDI
    Réponses: 1
    Dernier message: 05/04/2005, 09h26
  5. Aide de convertion de string
    Par touriste13 dans le forum SL & STL
    Réponses: 11
    Dernier message: 03/03/2005, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo