Erreur d'objet automation 'MSScriptControl.ScriptControl'
Bonjour/Bonsoir,
J'ai un problème dans mon programme, que je n'arrive pas à résoudre.
Le problème est le suivant :
J'aimerais évaluer dans une jauge la ram utilisé sur un pc distant.
Ni une ni deux, j'attaque le wmi via du vbs (si vous connaissez mieux, je suis preneur).
Tout fonctionne correctement jusque la, je récupere ma valeur de mémoire max, que je met en Jauge..BorneMax, puis ma valeur utilisé, que je met en valeur de Jauge.
Maintenant, je souhaite que ca se fasse en pseudo temps réél, c'est à dire en refresh automatique toute les 2/3 secondes.
Je lance donc une boucle de la forme :
Code:
1 2 3 4 5 6
| ###########################################
POUR i = 0 A 10
CheckRAM("monserveur") // Fct qui verifie la RAM, et qui rempli les jauges
Wait(200) // On attend 2 secondes pour recommencer, pour ne pas flooder de requetes
FIN
########################################### |
(j'ai fait un test sur 10 tours pour le moment, pour tester)
Tout fonctionne bien.
Pour un peu plus de clarté, voici ma fonction checkram()
Code:
1 2 3 4 5 6 7 8 9 10
| ###########################################
PROCEDURE CheckRAM(sNamesrv1)
nRAMuse est un entier = Get_RAM_used(sNamesrv1) // Check la RAM utilisé (valeur en Ko)
nRAMmax est un entier = Get_RAM_full(sNamesrv1) // Check la RAM totale (valeur en Mo)
SAI_NAME_1 = sNamesrv1 // Rempli un champs avec le nom machine
J_RAM_1..BorneMax = nRAMmax/1000 // Defini la borne Max de la jauge
J_RAM_1..Valeur = nRAMuse // Defini la borne Min de la jauge
########################################### |
Ainsi que une des deux fonctions de checking, ici Get_RAM_used()
Code:
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
| ###########################################
PROCEDURE Get_RAM_used(SrvName)
//
objWMIService est un objet Automation "MSScriptControl.ScriptControl" // Initialise l'objet WMI
ProgrammeVbs est une chaîne
ResultatVbs est une chaîne // Le resultat
// On écris tout le programme VBS (testé au préalable en environnement vbs standard)
//
ProgrammeVbs = "Function GetRam(SrvName)" + CRLF
//
ProgrammeVbs += "On Error Resume Next" + CRLF
ProgrammeVbs += "strComputer = SrvName" + CRLF
ProgrammeVbs += "strResult = " + Caract(34) + Caract(34) + CRLF
ProgrammeVbs += "Set objWMIService = GetObject(" +Caract(34) + "winmgmts:\\" + Caract(34) + " & SrvName &" + Caract(34) + "\root\cimv2" + Caract(34) + ")" + CRLF
ProgrammeVbs += "Set colItems = objWMIService.ExecQuery(" + Caract(34) + "SELECT * FROM Win32_OperatingSystem" + Caract(34) + ",,48)" + CRLF
ProgrammeVbs += "For Each objItem in colItems" + CRLF
ProgrammeVbs += "strResult = objItem.FreePhysicalMemory" + CRLF
ProgrammeVbs += "Next" + CRLF
ProgrammeVbs += "GetRam = strResult" + CRLF
ProgrammeVbs += "End Function"
objWMIService>>Language("VBScript") // On defini le language, ici du VBScript
objWMIService>>Reset() // On reset le wmi
WHEN EXCEPTION IN
objWMIService>>AddCode(ProgrammeVbs) // On ecris le prog
DO
Erreur("Erreur dans le programme vbs.....") // Si une erreur à l'écriture, une box
RENVOYER "" // Et on renvoi vide
END
ResultatVbs = ""
WHEN EXCEPTION IN
ResultatVbs = objWMIService>>Eval("GetRam("+Caract(34) +SrvName +Caract(34) +")") // On execute notre fonction
DO
Erreur("Erreur d'execution du programme vbs") // Si erreur, message
RENVOYER "" // Et on renvoi vide
END
RENVOYER ResultatVbs // On renvoi la valeur de notre chere fonction
########################################### |
Voila pour les fonctions.
Mon problème est le suivant.
Vu que je ne veux pas freezer ma fenetre principale en permanance, j'ai lancé mes fonctions dans un thread
séparé, avec un truc dans le style :
Code:
1 2 3 4 5 6 7 8 9 10 11
| #################################################
POUR i = 0 A 100
ThreadExécute("SrvInfo",threadNormal,Serveur1,"MonServeur")
Wait(500)
ThreadArrête("SrvInfo")
Wait(100)
FIN
############################################### |
Et la, c'est le drame.
A prioris il ne me ferme pas bien mon script VBS, ou mon instance WMI, je ne sais pas bien.
Voici l'erreur :
Citation:
#################################################
#################################################
Erreur à la ligne 15 du traitement Procédure locale Get_RAM_used.
L'objet automation 'MSScriptControl.ScriptControl' n'est pas installé sur votre système.
Informations techniques
Projet : InfoSrv
Dump de l'erreur du module <WD120VM.DLL> <12.01Cy>.
- Appel WL :
Traitement de <FEN_Fenêtre1.PROCEDURE.Get_RAM_used>, ligne <15>, thread <0>
- Niveau : erreur fatale (EL_FATAL)
- Code erreur : 2202
- Code erreur WD55 : 0
- Pas de code d'erreur système
- Pas de message d'erreur système
- Que s'est-il passé ?
L'objet automation 'MSScriptControl.ScriptControl' n'est pas installé sur votre système.
- Infos de debug :
__AlloueAutomation
- Infos attachées :
EIT_PILEWL :
Procédure locale Get_RAM_used (FEN_Fenêtre1.PROCEDURE.Get_RAM_used), ligne 15
Procédure locale Serveur1 (FEN_Fenêtre1.PROCEDURE.Serveur1), ligne 16
EIT_COMPOSANT :
EIT_DATEHEURE : 14/05/2009 16:54:56
- Identifiant dans le .err : 2202
Assistance
#################################################
#################################################
Or, cette erreur est totalement fausse, l'objet est bien installé sur mon système, preuve en est, sans thread ca
fonctionne très bien.
De plus, le premier tour de boucle fonctionne parfaitement, c'est au second qu'il s'emmele les pinceaux.
Avez vous une solution à me proposer, ou un début de piste ?
Cordialement.
Folcan