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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
###########################################
 
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 :


#################################################
#################################################
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