OVH Cloud OVH Cloud

Javascript et collections VBscript

6 réponses
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonjour à tous.

En javascript, j'adresse un serveur COM : var oaobj = new
ActiveXObject("Toto.titi");
Une fonction (RM) de ce serveur retourne une liste/collection (la
dénomination dépend du langage).

En VBscript, je peux récupérer ces données en faisant, par exemple :
sret= oaobj.RM()
For Each ietm in sret :
msgbox ss
next

Mais, en javascript, je ne récupère jamais qu'un objet vide. Le type est
bien <object>, mais un for ... in
ne retrouve jamais que la seule propriété : 0 , et aucune
valeur

J'ai essayé :
var sret= oaobj.RM();
sret= oaobj.RM();
var sret= new Array(oaobj.RM());
sret= new Array(oaobj.RM());


Quelqu'un aurait une idée de la syntaxe à respecter ?





Autre chose : j'ai voulu copier la collection VB dans un Array javascript,
mais je n'y arrive pas. J'obtiens soit "undefined", soit un objet vide.
Alors, que ça passe très bien avec des variables simples.

Une solution pour ça me permettrait également de régler mon problème.





Je vous remercie d'avance, et je paierai (virtuellement), une cyber-bière au
premier qui m'offrira une solution.


Bonne journée
--
Michel Claveau

6 réponses

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Oups ! ,Petite erreur, sur le code VBscript, il fallait lire :

For Each ss in sret :
msgbox ss
next

Vous aviez, bien sûr, déjà rectifié vous-même.
Avatar
Alexis Nikichine
Michel Claveau wrote:

En javascript, j'adresse un serveur COM : var oaobj = new
ActiveXObject("Toto.titi");
Une fonction (RM) de ce serveur retourne une liste/collection (la
dénomination dépend du langage).

J'ai essayé :
var sret= oaobj.RM();
sret= oaobj.RM();
var sret= new Array(oaobj.RM());
sret= new Array(oaobj.RM());


Quelqu'un aurait une idée de la syntaxe à respecter ?



Sans tester (pas de RM() sous la main, moi !), voici trois idées, en vrac:

1°) var sret = oaobj.RM().toArray()
2°) var sret = new VBArray(oaobj.RM().Items()).toArray()
3°) var sret = new VBArray(oaobj.RM().Keys()).toArray()


Autre chose : j'ai voulu copier la collection VB dans un Array javascript,
mais je n'y arrive pas.


Alors, si c'est effectivement une collection, les solution 2°) ou 3°)
devraient faire l'affaire, suivant que tu veux conserver les clés, ou
les valeurs.

Si tu veux garder l'association, essaye voir

function construitAssociation( collection )
{
var resultat = {};
var keys = new VBArray(collection.Keys()).toArray();

for(var i in keys)
{
resultat[keys[i]] = collection.Item(keys[i]);
}

return resultat;
}


Je vous remercie d'avance, et je paierai (virtuellement), une cyber-bière au
premier qui m'offrira une solution.



Prems ! (Y a pas marqué "une solution qui marche" :-)

Non, sérieusement, dis-moi ce que ça donne;


Alexis

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonsoir !


Merci ! La première soluce : var sret = oaobj.RM().toArray()
Fonctionne bien, sur l'appel par javascript du serveur COM.

Pour les autres syntaxes, je ferais des tests ce soir (tard, car là, je suis
invité), et ferai un petit compte-rendu ici.



Pour la bière, chose promise, chose due ; clique ici :
http://bergoiata.org/gif/f7.gif


@+
--
Michel Claveau
Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Bonjour !

La suite des tests :



Ce qui fonctionne :

var sret = new oaobj.RM().toArray();
var sret = new VBArray(oaobj.RM()).toArray();
var sret = new VBArray(vbfunc()).toArray(); //vbfunc() étant une
fonction VBscript, qui appelle oaobj.RM() et qui retourne une collection


Ce qui ne marche pas :
VBArray(oaobj.RM().Keys()).toArray()
VBArray(oaobj.RM().Items()).toArray()

Mais ce n'est pas grave, car, avec les trois syntaxes qui fonctionnent,
l'utilisation d'un : for (item in sret){ donne toutes les infos
nécessaires.




Encore merci (et, pour fêter ça : un peu de champ :
http://bergoiata.org/gif/boi24.gif )
--
Michel Claveau
Avatar
Alexis Nikichine
Michel Claveau - abstraction méta-galactique non triviale en fuite
perpétuelle. wrote:
Bonjour !

La suite des tests :



Ce qui fonctionne :

var sret = new oaobj.RM().toArray();
var sret = new VBArray(oaobj.RM()).toArray();
var sret = new VBArray(vbfunc()).toArray(); //vbfunc() étant une
fonction VBscript, qui appelle oaobj.RM() et qui retourne une collection


Ce qui ne marche pas :
VBArray(oaobj.RM().Keys()).toArray()
VBArray(oaobj.RM().Items()).toArray()


Merci, pour les résultats. En fait, avec mes questions, je dois donner
l'impression de pas tout comprendre à tout ("Essaye ça, ou ça, et sinon
ça"), c'est un peu vrai. En fait, et si on en croit la doc MSDB, les
méthodes .Keys() et .Items() doivent marcher sur un objet de type
Dictionnary, qu'on aurait pu par exemple avoir avec:

new ActiveXObject("Scripting.Dictionary");

Bon, là, c'est nickel, tout roule: on connait le type de l'objet qu'on a
(Scripting.Dictionary) et on sait ou fouiller dans ls MSDN.

Seulement, quand on a un serveur COM qui vous renvoie on sait pas trop
quoi, comment fait on pour savoir le type de
tableau/collection/container qu'il vous a renvoyé pour un appel donné ?
A part faire des essais d'appels de méthodes, voir s'ils marchent et
déduire petit à petit le type probable du tableau, bien sur.
objetRetourné.getType() ?? Sans se servir de la .tlb du serveur ? Et en
s'en servant ?

Voilou, merci, si vous avec un éclairage quelconque,

Alexis



Encore merci (et, pour fêter ça : un peu de champ :
http://bergoiata.org/gif/boi24.gif )


hips... n'en jetez plus !

Avatar
Michel Claveau - abstraction méta-galactique non triviale en fuite perpétuelle.
Re-Bonjour !

Le problème de COM, c'est qu'il transmet tout (et n'importe quoi). En
l'occurrence, je maîtrise le serveur COM, et pourtant, je n'arrivais pas à
récupérer, sous javascript, autre chose que "<object>". Je n'avais pas pensé
que "toArray" pourrait s'en sortir. Quand à "VBArray", je ne connaissais
pas.

Dans le même genre d'info, lorsque j'envoie, avec javascript, un Array, vers
un serveur COM (dans l'autre sens, donc), ce dernier (en Python), doit
utiliser une fonction COM "dispatch" pour retrouver les données. Alors que,
si j'envoie un valeur simple (une variable ou une constante), la lecture est
directe.

Ce qui pourrait sembler tordu est, en fait, une fonctionnalité. En effet,
c'est un (tableau de) pointeur(s) qui est passé en paramètre (pour un
Array). Du coup, je peux récupérer ce pointeur, pour manipuler
(lecture/écriture) directement les propriétés de l'objet sous-jacent (par
exemple un ".innerHTML" ou un ".value"). Attention, toutefois, si l'on est
obligé de passer par javascript (ou VBscript), pour établir le lien, on ne
peut pas accéder aux objets javascript, mais uniquement à ceux du navigateur
(I.E. au moins, car je ne crois pas que les autres soient capables de faire
ça).

Dans mes derniers essais, je fais des accès simultanés, depuis plusieurs
threads des serveurs COM. Et ça marche. Un exemple : soit un formulaire en
cours de saisie, d'une transaction financière. Un programme indépendant,
vérifie régulièrement, en tâche de fond, le cours du dollar. En cas de
changement, le contenu du champ correspondant du formulaire est modifié,
sans intervention de l'utilisateur, ni du javascript.

Par contre j'hésite à généraliser, car je prévois des formulaires pouvant
avoir plus de 5000 champs de saisie (ça peut sembler beaucoup, et pourtant
j'ai limité...) ; alors avoir plusieurs milliers de liens COM me fait un peu
peur, au niveau stabilité.


En tout cas, merci pour le tuyau qui m'a aidé, en m'évitant d'utiliser des
boucles, ou des sérialisations, pour passer des paramètres.

Bonne soirée
--
Michel Claveau