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

C++Builder Discussion :

Message d'erreur dans une fonction avec un AnsiString en paramètre


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Par défaut Message d'erreur dans une fonction avec un AnsiString en paramètre
    BOnjour à tous,

    encore un nouveau soucis avec mon passage sous Builder XE10.

    J'ai une erreur :
    Classe d'exception EEncodingError avec un message 'Aucun mappage pour le caractère Unicode n'existe dans la page de code multi-octet cible'.
    Le programme se compile très bien mais dès que je lance il me met cette erreur.

    J'ai plus ou moins identifier le problème. Mais c'est compliqué.

    Pour faire simple,
    J'ai une FormPrincipale que je cache au lancement de l'application et une FormIdentification que j'affiche d'abord. Dans cette FormIdentification j'appelle une fonction :

    void GererIdentificationChargementTux(AnsiString asTux); //Gère l'affichage du Tux passé en paramètre
    Le code étant :
    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
     
    void GererIdentificationChargementTux(AnsiString asTux)  //Gère l'affichage du Tux passé en paramètre
    {
      if(asTux != "")
      {
        TImage *Image = new TImage(0);
        TJPEGImage *pGraphTux = new TJPEGImage;
        if(FileExists(FormPrincipale->asRepertoireLogiciel+"Tux.DLL"))
        {
          HANDLE hTuxDll = LoadLibrary((FormPrincipale->asRepertoireLogiciel+"Tux.DLL").c_str());
     
          TResourceStream *Res = new TResourceStream((int)hTuxDll, asTux, RT_RCDATA);
     
          pGraphTux->LoadFromStream(Res);
          pGraphTux->Transparent = true;
          Image->Picture->Bitmap->Assign(pGraphTux);
          delete Res;
     
          FormIdentification->ImageIdentificationLogin->Visible = true;
          FormIdentification->ImageIdentificationLogin->Picture = Image->Picture;
        }
        else
          FormIdentification->ImageIdentificationLogin->Visible = false;
     
        delete Image;
        delete pGraphTux;
      }
      else
        FormIdentification->ImageIdentificationLogin->Visible = false;
    }
    //---------------------------------------------------------------------------
    Avec cela ça plante. Après quelques tests, en mettant tout le code en commentaire, l'application se lance.

    Le plus bizarre c'est que lorsque l'application plante, elle plante à la création de la FormPrincipale. Directement lors de l’exécution du constructeur où il n'y a aucuns codes. Avant même que la fonction ne soit appelée.
    De plus si dans cette fonction je remplace l'AnsiString passé en paramètre par un ''int'' cela passe aussi.

    Donc voila, je pense que c'est pas gagné mais si quelqu'un avait une idée,

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour.

    Citation Envoyé par LoicH Voir le message
    Le plus bizarre c'est que lorsque l'application plante, elle plante à la création de la FormPrincipale. Directement lors de l’exécution du constructeur où il n'y a aucuns codes. Avant même que la fonction ne soit appelée.
    En es-tu sûr ?

    La première étape est d'isoler la ligne de code C++ qui lance l'exception.
    Dans C++ Builder XE3, on peut configurer de telle sorte que le programme propose de s'arrêter en Debug chaque fois qu'une exception est levée, donc je pense que c'est possible aussi avec C++ Builder XE10.
    Alors, tu peux afficher l'état de la pile et voir quelle ligne de code C++ lance l'exception.

    Personnellement, après avoir lu ton autre fil, je soupçonne ta ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TResourceStream *Res = new TResourceStream((int)hTuxDll, asTux, RT_RCDATA);
    de prendre en paramètre un RT_RCDATA mal encodé, mais ce n'est qu'une hypothèse.

    Bonne chance.

    A part ça, je conseille d'utiliser des std::unique_ptr à la place des pointeurs nus sur lesquels il faut faire delete.
    Comme ça, quand une exception est levée, pas de fuite mémoire.

  3. #3
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut
    Réponse identique à mon post précédent
    Le portage en Unicode comporte certaines erreurs dans C++ builder que l'on ne retrouve pas dans Delphi
    Par ailleurs dans ton code tu ne libère pas l'objet TResourceStream ni le Handle de ta DLL --> MemoryLeak
    pour éviter de modifier tout le code déjà réalisé avec C++ builder 6 je te conseille d'utiliser des variables temporaires
    de Type UnicodeString que tu initialisera avec le contenu de tes paramètres AnsiString
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    En es-tu sûr ?

    La première étape est d'isoler la ligne de code C++ qui lance l'exception.
    Dans C++ Builder XE3, on peut configurer de telle sorte que le programme propose de s'arrêter en Debug chaque fois qu'une exception est levée, donc je pense que c'est possible aussi avec C++ Builder XE10.
    Alors, tu peux afficher l'état de la pile et voir quelle ligne de code C++ lance l'exception.

    Personnellement, après avoir lu ton autre fil, je soupçonne ta ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TResourceStream *Res = new TResourceStream((int)hTuxDll, asTux, RT_RCDATA);
    de prendre en paramètre un RT_RCDATA mal encodé, mais ce n'est qu'une hypothèse.
    Alors oui j'en suis sur. C'est bien le constructeur de la FormPrincipale qui me donne cette erreur c'est la ou le compilateur s'arrete. J'ai egalement fait du pas a pas. Comme vous j'avais cru que c'etait le TResourceStream mais après quelques tests, il s'avere que le programme plante des que j'utilise l'AnsiString passé en parametre.

    Citation Envoyé par DjmSoftware Voir le message
    Salut
    Réponse identique à mon post précédent
    Le portage en Unicode comporte certaines erreurs dans C++ builder que l'on ne retrouve pas dans Delphi
    pour éviter de modifier tout le code déjà réalisé avec C++ builder 6 je te conseille d'utiliser des variables temporaires
    de Type UnicodeString que tu initialisera avec le contenu de tes paramètres AnsiString
    cdlt
    C'est la ou je rebondi sur votre reponse. Etant toujours reste sur Builder 6 et n'avoir utilise que des AnsiString, je ne connaissais pas le UnicodeString.
    Je vais donc essaye de mettre tout mes AnsiString en UnicodeString.

    J'avais mis le parametre Mappage de _TCHAR en char. Je vais le remettre en wchar_t egalement comme tu le conseilles dans un autre post

    Citation Envoyé par DjmSoftware Voir le message
    Par ailleurs dans ton code tu ne libère pas l'objet TResourceStream ni le Handle de ta DLL --> MemoryLeak

    Alors il me semble que je libere bien le TResourceStream avec
    Mais le Handle effectivement... je ne le libere pas.

    Le chemin va etre long ... en tout cas merci.

    PS : desole pour le manque de tout les accents. Mais je suis au boulot avec un clavier US

  5. #5
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut
    Pour ma part pour éviter les erreurs que tu signale
    je recréerais un nouveau projet dans Seattle
    Le portage d'anciens projets depuis C++Builder 6 réserve parfois de mauvaises surprises
    et cela t'évitera de chercher des Bugs qui sont du aux portage
    Beaucoup de choses ont changés dans la définition des options de projets depuis C++ Builder 6 !!!!!

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Par défaut
    Alors légère avancée dans le problème.

    J'ai repassé le paramètre de Mappage de _TCHAR en wchar_t

    J'ai passé tout mes AnsiString en String et la ca passe.

    Par contre cette erreur reapparait un peu plus loin lorsque j'utilise les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int Pos(const UnicodeString substr, const UnicodeString str);
    ou
    string substr(int pos = 0, int n = string::npos) const
    J'utilise bien les bonnes fonctions ? ou j'aurais du garder AnsiPos() a la place de Pos().

    Mais se que j'arrive toujours pas a comprendre c'est que c'est toujours au niveau du constructeur de la FormPrincipale que le compilateur plante. Et non a l'endroit du code...

    DjmSoftware : Le pire c'est que je suis bien parti d'un projet vierge sous Builder XE10.

    Je vais continuer a étudier tout cela. Déja j'ai avancé un peu. Si des gens ont les composants TMS, je veux bien partagé mon début de programme pour y jeter un oeil.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. #Erreur dans une requête avec une fonction personnalisée
    Par pguiheu dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 04/07/2006, 15h45
  2. [débutant] erreur dans une fonction
    Par Skizo dans le forum Access
    Réponses: 7
    Dernier message: 18/05/2006, 10h46
  3. Erreur dans une fonction
    Par dark_vidor dans le forum Langage
    Réponses: 6
    Dernier message: 15/01/2006, 10h23
  4. Réponses: 2
    Dernier message: 11/08/2004, 15h01
  5. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

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