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

Windows Discussion :

Scripting : récupération de la valeur de retour du parse


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 44
    Points : 38
    Points
    38
    Par défaut Scripting : récupération de la valeur de retour du parse
    Bonjour,

    J'utilise l'interface IActiveScriptParse et sa méthode ParseScriptText pour exécuter des scripts javascript dans mon application (C++) windows et je rencontre un problème pour récupérer la valeur de retour.

    Exemple :
    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
    // Évalue du javascript
    // @param pJsExpression Du code javascript qui retourne une valeur
    // exemple :
    // (function () {
    //    return [1, 2, 3];
    // }());
    HRESULT MaClass::EvalJS(const string & pJsExpression) {
    	CString script(pJsExpression.c_str());
    	VARIANT result
    	EXCEPINFO ei;
    	BSTR bstrScript = script.AllocSysString();
    	
    	VariantInit(&result);
    	HRESULT hr = mParser->ParseScriptText(bstrScript, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION , &result, &ei);
    	SysFreeString(bstrScript);
    	
    	// traitement du résultat 'result'
    	// ...
    	
    	return hr;
    }
    Avant je ne récupérais que des valeurs de type simple (string, int, ...) et je m'en sortais bien mais maintenant le parse me retourne un tableau et c'est là que je n'y arrive plus.

    Je pensais obtenir un variant de type VT_ARRAY mais à la place, j'obtiens un VT_DISPATCH et je ne sais absolument pas quoi en faire (récupérer les valeurs).

    Quelqu'un aurait un idée pour éclairer ma lanterne?

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    En effet un tableau JavaScript est un objet qui encapsule un vrai tableau et non réellement un tableau comme en C. Un objet OLE (VT_DISPATCH) implémente l'interface IDispatch(Ex). Utilise la méthode Invoke(Ex) pour accéder à une méthode ou a une propriété de l'objet.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    Merci pour ces précisions. Ça fonctionne maintenant.

    J'étais déjà tombé sur ces méthodes mais je ne voyais pas trop comment les utiliser. Le debuggeur de VS m'indiquait que pdispVal était un IUnknown du coup, je ne savais pas s'il fallait trouver un moyen de faire des conversions IUnknown/SafeArray, ou IUnknown/IDispatch alors que en fait non. Enfin bref, c'était un peu du chinois n'étant pas très familier avec OLE et COM.

    Voila ce que j'ai fais :

    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
    // Évalue du javascript
    // @param pJsExpression Du code javascript qui retourne une valeur
    // exemple :
    // (function () {
    //    return ['toto', 2, true];
    // }());
    HRESULT MaClass::EvalJS(const string & pJsExpression) {
    	CString script(pJsExpression.c_str());
    	VARIANT result
    	EXCEPINFO ei;
    	BSTR bstrScript = script.AllocSysString();
    	
    	VariantInit(&result);
    	HRESULT hr = mParser->ParseScriptText(bstrScript, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION , &result, &ei);
    	SysFreeString(bstrScript);
    
    	if (SUCCEEDED(hr)) {
    		// Recuperation des valeurs du tableau
    		GetResult(res);
    	}
    
    	return hr;
    }
    
    // pRes contient un talbeau
    HRESULT MaClass::GetResult(VARIANT & pRes) {
    	DISPPARAMS dp = {0, 0};
    	OLECHAR FAR* szMember = _T("shift");
    	DISPID disp;
    
    	// recuperation de la methode 'shift' de l'object javascript Array
    	HRESULT hr = pRes.pdispVal->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &disp);
    
    	// Récuperation des valeurs du tableau
    	if(SUCCEEDED(hr)) {
    		VARIANT message;
    		do {
    			VariantInit(&message);
    			hr = pRes.pdispVal->Invoke(disp, IID_NULL, 0, DISPATCH_METHOD, &dp, &message, NULL, NULL);
    			// traitement sur la valeur
    			//...
    		} while(message.vt != VT_EMPTY);
    	}
    	return hr;
    }
    Merci

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

Discussions similaires

  1. Récupérer dans un programme C la valeur de retour d'un script shell
    Par domiq44 dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 23/12/2009, 20h02
  2. Appel de fonctions et récupération de la valeur de retour
    Par Mickael Baron dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/01/2009, 13h57
  3. récupération d'un valeur de retour avec WCF
    Par fredonouille dans le forum Services Web
    Réponses: 4
    Dernier message: 12/01/2009, 11h17
  4. expect + tester valeur de retour d'un script
    Par dr_octopus74 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 30/04/2007, 16h12
  5. [AJAX] Récupération d'une valeur en retour d'un php
    Par lodan dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/02/2007, 21h18

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