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++/CLI Discussion :

Problème bizarre en mode Release


Sujet :

C++/CLI

  1. #1
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut Problème bizarre en mode Release
    Bonjour,

    J'ai problème bizarre en mode Release.
    Le code est identique.

    Voici la fonction. Elle a pour but d'afficher une boite de dialogue pour rechercher un fichier pour ensuite récupérer le nom du fichier sélectionné par l'utilisateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private: System::Void butLOAD_Click(System::Object *  sender, System::EventArgs *  e)
    {
      System::Windows::Forms::DialogResult result;
     
      result = ofdLIC->ShowDialog();
      if (DialogResult::OK == result)
      {
         IntPtr p = Marshal::StringToHGlobalAnsi(this->ofdLIC->FileName);
         char *fn = reinterpret_cast<char*>(static_cast<void*>(p));
         System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
        ...
      }
    ofdLIC est un openfiledialog.

    En mode Debug, fn est bien rempli alors qu'en mode Release fn est toujours null.

    Est ce que quelqu'un aurait une idée ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je me demande bien pourquoi tu utilises un char * ... enfin bon, admettons.

    Mais tu le libères juste après l'avoir alloué, il faut l'utiliser avant le FreeHGlobal

  3. #3
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut Problème bizarre en mode Release
    Bonjour,

    En fait j'ai besoin du char * car, j'appelle une fonction d'un dll mfc qui ne prend que des char *.

    Par ailleurs, j'essaie d'appeler cette fonction avant de faire FreeHGlobal. Je ne l'ai pas indiqué dans mon précédent message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         IntPtr p = Marshal::StringToHGlobalAnsi(this->ofdLIC->FileName);
         char *fn = reinterpret_cast<char*>(static_cast<void*>(p));
         DllFunc_CreateConfigFile(fn);
         ....
         System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
    J'ai mis également un point d'arrêt sur la ligne char * fn = ... et là fn est bien null !

    ça peut être quoi le problème ? car ça fonctionne bien en mode Debug.
    Le problème reste identique même si j'enlève la ligne FreeHGlobal.

    Merci d'avance.

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    un problème de mémoire peut occasionner des différence entre debug et release
    moi j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* chaineChar = static_cast<char *>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(chaineManagee).ToPointer());
    Pour la conversion

    après ... ofdLIC->FileName vaut bien quelque chose ?

    tu as bien besoin d'un char * ? pas un TCHAR ?

  5. #5
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut Encore quelquechose de louche
    Bonjour,

    J'ai appliqué ta méthode et là encore il y a quelque chose de bizarre.

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *fn;
    fn = static_cast<char *>System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(ofdLIC->FileName).ToPointer());
    DllFunc_CreateConfigFile(fn);
    J'ai mis en place un point d'arrêt et voila ce qui se passe.
    Juste après avoir passé la ligne fn = ..., j'ai essayé de visualiser le variable fn avec un espion express et là j'ai : fn erreur : l'identificateur 'fn' est hors de portée. Pourtant je suis bien dans la même fonction.

    Est ce que le problème pourrait venir de mon ofdLIC (OpenFileDialogue) ?
    Lors du debug, ofdLIC->FileName a bien le chemin du fichier que j'ai sélectionné.
    C'est complètement imcompréhensible.

Discussions similaires

  1. Problème de mutex en mode release
    Par fredppp dans le forum C++/CLI
    Réponses: 3
    Dernier message: 05/11/2010, 20h26
  2. Problème "ON_CONTROL_RANGE" mode release
    Par BoyzInDaProject dans le forum MFC
    Réponses: 5
    Dernier message: 11/05/2007, 17h24
  3. problème en mode release
    Par Polux95 dans le forum Qt
    Réponses: 20
    Dernier message: 25/04/2007, 09h58
  4. [VB.NET] Problème exécution en mode release.
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2005, 17h39

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