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

MFC Discussion :

[OLE2/ActiveX] Crash sur appel à InvokeHelper


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut [OLE2/ActiveX] Crash sur appel à InvokeHelper
    Salut,

    je suis victime d'un plantage (StackOverflow) au moment de faire appel la méthode InvokeHelper pour exécution d'une des fonctions d'un ActiveX.

    Methode appelée : (généré par le wizard)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    short MonOCX::MaFonction(LPCTSTR DataStr)
    {
    	short result;
    	static BYTE parms[] =
    		VTS_BSTR;
    	InvokeHelper(0x24, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
    		DataStr);
    	return result;
    }
    L'ID de la méthode (0x24) est bon, il se réfère à la bonne fonction de l'ActiveX.

    En entrée on a une CString (DataStr), seul paramètre, défini dans le tableau de params par VTS_BSTR.

    Le type de la valeur de retour (short) est bien défini : VT_I2.


    Hors, l'application crash ligne 252 dans oledisp2.cpp au moment d'un SysAllocString()... Mais pourquoi ? Les paramètres sont pourtant correct.

    OleDisp2.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #if !defined(_UNICODE) && !defined(OLE2ANSI)
    			case VT_BSTRA:
    				{
    					LPCSTR lpsz = va_arg(argList, LPSTR);
    					pArg->bstrVal = ::SysAllocString(T2COLE(lpsz));
    					if (lpsz != NULL && pArg->bstrVal == NULL)
    						AfxThrowMemoryException();
    					pArg->vt = VT_BSTR;
    				}
    				break;
    #endif
    On peut voir que la chaine subit une conversion (vers du wild vraissemblablement) via la macro A2W (ATLCONV.H).

    Le fait que le crash survienne dans les fichiers MFC, ne laisse guère de marge de manœuvre...

    Bref, je sèche quant à l'origine de ce crash...

    Merci d'avance.

    Pierre.

    NB:
    Config : VC6

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Y a-t-il récursivité quelque part ?

    A2W alloue sur la pile, en cas d'appels récursifs, c'est dramatique et provoque des stack overflows.

    Mieux vaut utiliser CA2W.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci pour ta réactivité White_tentacle.

    Citation Envoyé par white_tentacle Voir le message
    Y a-t-il récursivité quelque part ?

    A2W alloue sur la pile, en cas d'appels récursifs, c'est dramatique et provoque des stack overflows.
    Pas de recursivité à ma connaissance, juste un appel à m_MonOcx.MaFonction("szStr"); puis le crash dans OleDisp2.cpp.

    Citation Envoyé par white_tentacle Voir le message
    Mieux vaut utiliser CA2W.
    Je ne peux pas changer ça...A2W est appelée dans OleDisp2.cpp via T2COLE.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Et surtout, CA2W n'est pas disponible sous VC6.
    Pour info, VC8 utilise directement une CStringW, donc je pense que VC6 est bien le noyau du problème.

    Pour le contourner, je te propose de modifier ta fonction générée par le wizard pour faire la conversion unicode toi-même (de la façon qui te plaira, mais je conseille de créer/utiliser une classe spécifique) avant d'appeler InvokeHelper...
    Et remplacer VTS_BSTR par VTS_WBSTR.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci medinoc pour ces précisions. Cette solution me plait.

    Bon c'est testé et plus de crash. Bravo !

    Un grand merci pour vos réponses et à Developpez.com car se sentir entouré de pros n'a pas de prix.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Encore une question :

    Pourquoi ce plantage ?

    Est-ce la macro A2W qui n'arrivait pas à convertir la chaine (approximativement 500 000 caractères) ?

    SysAllocString qui n'arrivait pas allouer assez d'espace ?

    Je sens que quelqu'un à la réponse...

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Eh bien, vu que A2W utilise alloca pour stocker son buffer (et ne pas avoir à le désallouer manuellement), ça sent le débordement de pile.
    CA2W n'a pas ce problème parce que c'est une classe C++, pas une macro que je soupçonne d'être utilisable en C.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Effectivement. D'ailleurs, selon MSDN : alloca génére une exception de type StackOverflow au cas où elle n'arrive pas à allouer l'espace nécessaire.

    Donc pour résumer pour ceux qui auraient le même soucis :
    Se débrouiller pour faire passer une chaine plus petite, ou faire la conversion vers l'unicode vous même en modifiant le type des paramètres passés à InvokeHelper (VTS_WBSTR au lieu de VTS_BSTR).

    Encore merci.

    Pierre.

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

Discussions similaires

  1. [9.3] Crash incessants sur appels de fonctions + serveur "en double"
    Par Shirraz dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/10/2014, 20h39
  2. [WD-2010] word crash sur l'appel à doc.close
    Par dzincou dans le forum Word
    Réponses: 0
    Dernier message: 12/06/2012, 09h52
  3. Perl.exe crash à chaque appel
    Par Fabien Celaia dans le forum Langage
    Réponses: 4
    Dernier message: 07/06/2006, 08h56
  4. [Disques Durs] Prévenir un crash sur un disque dur
    Par Furius dans le forum Composants
    Réponses: 6
    Dernier message: 07/01/2006, 17h04
  5. 2 ActiveX identique sur une même fenêtre ?????
    Par cathar_rhythm dans le forum MFC
    Réponses: 3
    Dernier message: 14/11/2005, 20h21

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