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
    Membre extr�mement actif
    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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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