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 :

(MSXML4.DLL): 0xC0000005: Access Violation sur un HttpRequest->responseText


Sujet :

Visual C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut (MSXML4.DLL): 0xC0000005: Access Violation sur un HttpRequest->responseText
    Bonjour,

    Je viens demander votre aide, parce que je n'arrive pas à trouver une solution par rapport à un problème que j'ai, je vous l'expose :

    J'ai un serveur codé en java et un client codé en C++.
    Le client lance à un moment une requete vers le serveur, et lorsqu'il recoit la réponse et qu'il veut la récuperer, il n'y arrive pas, en effet lorsqu'il execute la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l_xReponse = HttpRequest->responseText;
    l'erreur suivante apparait dans le débugger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    First-chance exception in MonProgramme.exe (MSXML4.DLL): 0xC0000005: Access Violation.
    Et cette erreur n'apparait que dans certains cas. Alors peut-etre qu'il y aurait des caractères particuliers à éviter dans les réponses de la requete ou une suite de caractères ... Je ne vois pas trop, j'ai besoin de votre aide.

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Alors je voudrais juste ajouter des précisions sur mon problème, parce que je viens de faire un debug sur le serveur qui est en java et j'ai pu remarqué que lorsque la chaine de caractère de la réponse à envoyer contenait exactement 4091 caractères, le client ne pouvait pas récupérer cette réponse.

    Du coté serveur on utilise une HttpServletResponse et pour écrire dans cette réponse on utilise un PrintWriter et on fait un getPrintWriter ensuite.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    D'où vient HttpRequest? (type, allocation, obtention)? On dirait que le pointeur est invalide.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour,
    D'où vient HttpRequest? (type, allocation, obtention)? On dirait que le pointeur est invalide.

    Bonjour 3DArchi,

    le HttpRequest est défini comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MSXML::IXMLHttpRequestPtr HttpRequest;		// Instance de requête
    On crée l'instance comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l_hResult = HttpRequest.CreateInstance("Msxml2.XMLHTTP.4.0");

    Pour remplir la requête et l'envoyer :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    EError CProtocoleHTTP::EnvoyerRequete(const SArrayParametreHTTP& p_xParametres)
    {
    	int        i              = 0;	// Variable de boucle
    	CString    l_sParametre   = ""; 
    	CString    l_sParametres  = ""; // Paramètres de la requête
    	EError      l_xError   = EDotiErrOk; // Erreur
    	VARIANT    l_xParametres;				// Paramètres envoyés dans la requête HTTP
     
    	// Initialisation de la variable VARIANT
    	::VariantInit(&l_xParametres);
    	l_xParametres.vt = VT_BSTR;
     
    	// Vérifier que la requête est valide
    	if(m_bRequeteInvalide == false) 
    	{
    		try
    		{
    		HttpRequest->setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    		for(i = 0;i < p_xParametres.GetSize(); i++)
    		{
    			l_sParametre = p_xParametres[i].GetLibelle()+"="+p_xParametres[i].GetValeur();
    			EncoderParametre(l_sParametre);
    			// Construction de la chaîne de paramètres
    			l_sParametres += l_sParametre;
    			// Rajout du & pour séparer les paramètres
    			if(i != p_xParametres.GetSize()-1)
    			{
    				l_sParametres += "&";	
    			}
    		}
    		// Allocation de la variable VARIANT avec les paramètres à envoyer
    		l_xParametres.bstrVal = l_sParametres.AllocSysString();
     
    		// Envoi des paramètres
     
    			HttpRequest->send(l_xParametres);
    			SysFreeString(l_xParametres.bstrVal);
    		}
    		catch(_com_error  eExcept)
    		{
    			m_bRequeteInvalide = true;
    			l_xError = EErrEnvoiRequete;
    		}
    	}
     
    	return l_xError;
    }
    et pour récuperer la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void CProtocoleHTTP::GetReponseTexte(CString& p_xReponse)
    {
    	_bstr_t l_xReponse; // Réponse du serveur
    
    	// Vérifier que la requête est valide
    	if(m_bRequeteInvalide == false) 
    	{
    		l_xReponse = HttpRequest->responseText;
    		p_xReponse.Format(_T("%s"),LPCTSTR(l_xReponse));
    	}
    }
    Et c'est quand on récupere "reponseText" qu'on a l'erreur.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    J'ai de vagues souvenir de problème de ce genre avec les bstr, MSXML et de tailles trop importantes. Mais le souvenir est trop flou et trop lointain pour être crédible.
    Donc, je ne peux que te donner le conseil suivant : peux-tu utiliser responseXML ou responseStream à la place de responseText ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'ai de vagues souvenir de problème de ce genre avec les bstr, MSXML et de tailles trop importantes. Mais le souvenir est trop flou et trop lointain pour être crédible.
    Donc, je ne peux que te donner le conseil suivant : peux-tu utiliser responseXML ou responseStream à la place de responseText ?

    Alors j'ai testé quelque chose hier, j'ai utilisé "Msxml2.XMLHTTP.6.0" à la place de la version 4.0 pour instancier et je n'ai plus de problème. J'espere juste qu'il n'y aura pas de régression sur les autres fonctions.
    Il me reste plus qu'à inclure msxml6.dll dans l'exe pour qu'il soit valide sur n'importe quel pc.


    EDIT : Donc la solution était bien qu'il y avait un bug dans MSXML4, j'ai donc utilisé la dll MSXML6.

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 09/10/2007, 10h20
  2. 0xC0000005 Access violation à l'appelle de DLL
    Par mamwrya dans le forum Visual C++
    Réponses: 2
    Dernier message: 28/06/2007, 09h35
  3. [0xC0000005: Access Violation.]
    Par ARachid dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 24/04/2007, 23h34
  4. Access violation sur un new
    Par cedekasme dans le forum C++Builder
    Réponses: 16
    Dernier message: 23/01/2007, 14h32
  5. Réponses: 2
    Dernier message: 16/11/2006, 17h09

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