OVH Cloud OVH Cloud

Question aux spécialistes de VBscript

5 réponses
Avatar
Méta-MCI
Bonjour !


Je rentre de vacances avec un problème.

J'ai voulu essayer VBScript pour tester des appels à un serveur COM
dynamique.
Et ça plante...

Exemples de messages d'erreur :

MsgBox oa.builtin___upper("aa zz ee rr tt yy")
xxx.vbs(3, 1) Erreur d'exécution Microsoft VBScript: Utilisation non
autorisée de Null: 'oa.builtin___upper(...)'

Set vret = px.retouridem("AZERTY")
xxx.vbs(4, 1) Erreur d'exécution Microsoft VBScript: Cet objet ne gère
pas cette propriété ou cette méthode: 'px.retouridem'

MsgBox oa.sinverse("aa zz ee rr tt yy")
xxx.vbs(5, 1) Erreur de compilation Microsoft VBScript: Instruction
attendue


Alors que tout est correct.

Quelques précisions :
- Dans un serveur COM dynamique, les fonctions ne sont pas définies à
l'avance. Il n'y a donc aucune bibliothèque de type possible. C'est le
serveur qui doit traiter l'appel.
- en l'occurrence, le serveur reçoit bien l'appel, mais VBscript envoie
un paramètre DISPATCH_PROPERTYGET au lieu de DISPATCH_METHOD
- d'ailleurs, les appels fonctionnent, pour des propriétés ; ça
n'accroche que pour les fonctions.
- il arrive souvent qu'un appel COM dynamique se fasse en deux temps : le
client envoie une requête de propriété, le serveur envoie une erreur
DISP_E_MEMBERNOTFOUND, et le client devrait renvoyer la requête de fonction.
Mais VBscript n'a pas l'air de gérer ça.
- côté serveur, j'ai essayé de forcer un appel à la fonction, mais ça
plante pareil.
- VBscript ne supporte pas l'appel avec des points multiples. Par
exemple, "oa.builtin.upper(" donne "Erreur d'exécution Microsoft VBScript:
Objet requis:" ; pour contourner cela, j'utilise un remplacement, à la
volée, d'un triple souligné par un point. Cela fonctionne avec d'autres
langages, et avec les propriétés pour VBscript.
- ça fonctionne avec d'autres langages (Python, Ruby, ObjectPal/Paradox),
alors, pourquoi ça accroche avec VBscript ?
- ça plante pareillement avec JScript.



Si quelqu'un avait une idée de solution, je l'en remercie d'avance.

@+

Michel Claveau

5 réponses

Avatar
Jean
Je rentre de vacances avec un problème.

J'ai voulu essayer VBScript pour tester des appels à un serveur COM
dynamique.


Il est écrit dans quel language le serveur com ?

Amicalement,

--
Jean - JMST
Belgium

Avatar
Michel Claveau
Re !

Il est écrit dans quel language le serveur com ?


En Python 2.4.3 + PyWin32. Avec une double entrée : classique
(statique) et dynamique (comprenant 2000 fonctions, dont plus de la
moitié appelable directement, si ça marche).

--
@-salutations

Michel Claveau

Avatar
Jean
Re !

Il est écrit dans quel language le serveur com ?


En Python 2.4.3 + PyWin32. Avec une double entrée : classique (statique) et
dynamique (comprenant 2000 fonctions, dont plus de la moitié appelable
directement, si ça marche).


Je ne connais pas assez Python mais je suppose que c'est l'utilisation
de PyWin32 dans Python qui vous permet de faire ça, parceque sans
language dit "de haut niveau", je ne voyais à la limite qu'un petit
chipo avec un fichier WSC pour faire ça.

Je jetterai un coup d'oeil si je trouve le temps.

Sinon amha c'est un problème de construction de vos méthodes (en Python
si j'ai bien compris) puisqu'il me semble évident que vos méthodes sont
prises pour des propriétés par VBS/JS.

Il faudrait aussi demander sur un groupe Python amha.

Amicalement,

--
Jean - JMST
Belgium


Avatar
Méta-MCI
Bonsoir !


Le problème, c'est que ça marche avec Python, Object-Pal, et Ruby.
Mais, ça ne marche pas avec VBscript, ni Jscript.

Je partage l'avis, sur le fait que VBS prend les méthodes pour des
propriétés. Mais, il faut voir que les méthodes n'existent pas, telles
qu'appelées, car le serveur peut très bien faire autre chose que ce qui est
demandé...

Par exemple, VBscript refuse une construction de ce genre :

Set obj = WScript.CreateObject("Toto.aaa")
Set vret = obj.bib.str.sinverse("AZERTY")
(à cause des points multiples)


J'ai contourné le problème, en interceptant le triple souligné. Donc,
lorsque VBS fait :

Set obj = WScript.CreateObject("Toto.aaa")
Set vret = obj___bib___str___sinverse("AZERTY")

Le serveur traite obj.bib.str.sinverse("AZERTY")

Et le tour est joué... sauf avec VBS/JS.

Mais je cherche... lorsque j'ai le temps...

@+

MCI
Avatar
Méta-MCI
Problème résolu.

J'ai modifié mon serveur, pour qu'il traite les appels à la sauve VBS
(propriété + méthode mélangées), en plus des appels normaux (successivement
propriété, puis méthode, si la propriété est inexistante).

Résultat : ça marche.

Conclusion : toutes les fonctions dynamiques de Ponx peuvent être utilisées
depuis VBscript et Jscript. Mais aussi, du coup, avec Auto-It (mon dernier
test réussi).


Je vais pouvoir m'éclater, à scripter dans tous les sens...

Bonne nuit

Michel Claveau