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

WinDev Discussion :

Erreur d'objet automation 'MSScriptControl.ScriptControl'


Sujet :

WinDev

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 5
    Points : 3
    Points
    3
    Par défaut 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 : 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

  2. #2
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Tu pourrais faire la boucle dans ton thread, ça éviterait d'en créer plusieurs fois par secondes. Tu devrais aussi éviter le ThreadArrete qui pourrait mal fermer ton thread. Finalement, le problème viens peut-être de l'exécution dans un thread, tu devrait peut-être essayer avec une procédure automatique utilisant un timer, ton code serait donc exécuter dans le thread principal.
    «Un problème bien défini est un problème à moitié résolu.»

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oui mais dans ce cas, deux solutions :

    Soit je rédui mon temps de refresh à une dixaines de secondes, et dans ce cas ce n'est plus du "temps réél".
    Sachant que pour le moment je fais le test sur un serveur, mais a terme il y en aura une dixaine.

    La procédure prend entre 1 et 2 secondes a s'executer.
    Donc 2secondes * 10serveurs = 20 secondes.

    Donc je ne pourrais pas faire un autre refresh avant 20 secondes, ce qui est
    bien trop long.

    Pourquoi ThreadArrete ferme mal mon thread ? Ce n'est pas la fonction pour fermer un thread en cours d'execution ??

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    J'avais en même temps posté sur les forum Windev, et une réponse similaire m'a été donné :
    >Bonsoir,
    >
    >Question toute bête pourquoi lancer la thread dans la boucle et la refermer
    >ensuite ?
    >
    >Pourquoi ne pas mettre la boucle dans la thread avec un multitache(-500), ce
    >qui fait que la consultation de la mémoire se fera deux fois par secondes
    >dans un process séparé ...
    >
    >donc la procédure serait
    >
    >Procedure MaProcThread()
    > Boucle
    > CheckRAM("monserveur")
    > threadpause(500) //
    > si StopThread alors sortir // StopThread est une variable globale au
    >projet
    > fin
    >fin
    >
    >
    >Il ne te reste plus qu'a lancer MaProcThread avec un ThreadExecute et pouf
    >pouf.
    >
    >Albert P.
    Tout fonctionne pour le mieux grâce à cela.

    Merci à vous.

  5. #5
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    C'était ma première solution! En passant, fais attention à l'utilisation de temps réel qui ne veut pas dire très vite mais à intervalle constant. Une fois au 5 ans, c'est du temps réel.
    «Un problème bien défini est un problème à moitié résolu.»

Discussions similaires

  1. [AC-2007] Erreur:L'objet ne contient pas d'objet Automation
    Par sophie) dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2012, 21h50
  2. Erreur quand je mets un objet automation en session
    Par WebPac dans le forum ASP.NET
    Réponses: 11
    Dernier message: 21/12/2011, 10h50
  3. [AC-2007] Erreur : pas d'objet automation "Layout"
    Par atech dans le forum IHM
    Réponses: 1
    Dernier message: 26/09/2011, 15h21
  4. Message Erreur d'objet Automation
    Par Syrrus dans le forum IHM
    Réponses: 1
    Dernier message: 08/02/2008, 09h56
  5. Réponses: 6
    Dernier message: 03/09/2003, 10h29

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