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

Visual C++ Discussion :

le passage de paramètre échoue dans une application managée


Sujet :

Visual C++

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut le passage de paramètre échoue dans une application managée
    bonjour,
    J'ai un problème d'intégrité de données.
    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
    erc  CWfStream::getline( FILE* pFile, System::String^ sLine)
    {
       int len;
       wchar_t sTemp[80];
    	try
    	{
    	   std::fgetws( sTemp, 80, pFile);
    	   sLine = gcnew String( sTemp);
    	   len = sLine->Length;
    	   if( len > 0)
    	   {
    		   return( 0);
    	   }
    	   else
    	   {
    		   if( CWfStream::eof() != false)
    			   return( 1);
    		   else
    			   return( -1);
    	   }
    	}
    	catch(...)
    	{
    		//throw Doc_exception("erreur dans le getline", 0);
    	}
    }
    dans cette méthode la valeur de sline est "[ServerInformation]", ce qui est consistant
    mais au retour dans l'appelant la valeur est "";
    Comment ce fait il qu'un handler System::String^ ne vive pas au delà de la méthode
    Je vous met le code de l'appelant:
    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
    //A variable to hold the fetched line in String format
        System::String^ sLine;
        //A variable to hold the position of the searched character
        unsigned int iPos;
        bool b_noMoreLine = false;
        bool b1,b2;
        //If the INI file is not open then return FAILURE
        if (!CWfStream::is_open())
        {
          return FAILURE;
        }
        //Move the file pointer to the beginning of the file
        CWfStream::seekg(0);
        //Loop till the end of the file
        b1 = CWfStream::eof() != true;
        b2 = b_noMoreLine != true;
        while( b1 && b2)
        {
    		size_t len;
    		int iStatus;
    		//Get a line from the file
    		iStatus = CWfStream::getline( pFile, sLine);
    		const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni( sLine)).ToPointer();
    		wchar_t* tmp = (wchar_t*)chars;
    		Marshal::FreeHGlobal( IntPtr( (void*)chars));
    c'est la méthode getline qui ne renvoi pas le paramètre sLine.
    celui qui me répondra sera

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Partie 1:
    Les System::String sont immuables, et tu passes son handle managé par valeur...
    Utilise un passage par référence ou passe un StringBuilder à la place.

    Pour le passage par référence, il te suffirait de déclarer le paramètre ainsi:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using namespace System::Runtime::InteropServices;
     
    CWfStream::getline( FILE* pFile, [Out] System::String^% sLine)

    Partie 2:
    Qu'est-ce que c'est que cette horreur?
    Code erroné : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni( sLine)).ToPointer();
    		wchar_t* tmp = (wchar_t*)chars;
    		Marshal::FreeHGlobal( IntPtr( (void*)chars));
    Après le FreeHGlobal(), ni chars ni tmp ne sont des pointeurs valides!

    Si tu utilises au moins .Net 4.0, utilise la fonction marshal_as;
    Sinon, ça peut être plus délicat, mais je recommande d'utiliser PtrToStringChars() pour obtenir un interior_ptr<const wchar_t>, construire un pin_ptr<const wchar_t> dessus, et passer le tout au constructeur de std::wstring.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/11/2015, 14h26
  2. Réponses: 1
    Dernier message: 30/12/2011, 11h51
  3. Réponses: 1
    Dernier message: 29/06/2011, 01h55
  4. Passage de paramétre dynamique dans une requete SQL
    Par d.tellier dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/01/2010, 12h57
  5. Passage de paramètre "File" dans une fonction
    Par saket2114 dans le forum Général Java
    Réponses: 10
    Dernier message: 28/10/2009, 16h40

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