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

Delphi Discussion :

Function avec variable method


Sujet :

Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut Function avec variable method
    Bonjour à tous,
    je suis entrain de créer une fonction et je lui rentre des paramètres et une method. Il me renvoie erreur quand je lui envoie un String comme method, ce qui me parrais logique, mais comment initialiser une variable method et lui donner une valeur pour ma fonction?? Merci d'avance a tous

  2. #2
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    voila la fonction
    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
    function setExecWMI(Instance, Properties, Value :String) :Integer;
    var
      WmiLocator:          TSWbemLocator;
      WmiService:          SWbemServices;
     
      ArrayVariant:        OleVariant;
      ObjectEnumerator:    IEnumVariant;
      NumberItem:          LongWord;
    begin
      WmiLocator:= TSWbemLocator.Create(nil);
      try
        Screen.Cursor := crAppStart;
        // Connexion WMI (PCName, 'ROOT\CIMV2', UserName, UserPassword, '', '', ...)
        WmiService := WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                              '', wbemConnectFlagUseMaxWait, nil);
     
        ArrayVariant := WmiService.ExecQuery(Instance, 'WQL', 0, Nil);
     
        // Affecte un énumérateur pour la collection d'objet SWbemObject
        ObjectEnumerator:= IUnknown(ArrayVariant._NewEnum) as IEnumVariant;
        while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
        begin
          Result := ArrayVariant.Properties(value);
        end;
        Screen.Cursor:= crDefault;
      Finally;
        ArrayVariant := Unassigned;
        WmiLocator.Disconnect;
        WmiLocator.Free;
      end;
    end;
    la variable Properties me pose problème et demande que ce soit une method

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 001
    Par défaut
    le paramètres n'est pas utilisé dans ta fonction, comment peut-on comprendre ton besoin, dans ce cas ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    Il se trouve à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := ArrayVariant.Properties(value);
    Properties me dit qu'il devrait être une method mais c'est une variable en string... comment faire?

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 001
    Par défaut
    Ah, précise donc

    tu as un paramètres Properties et ArrayVariant.Properties(value);
    ils n'ont rien à voir, si tu confonds ça, c'est mal barré ...

    deplus comment ArrayVariant peut-il s'avoir qu'il a un Properties

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectEnumerator.Properties[Value]
    Ce code ci dessus, serait plus cohérent, mais comme je ne connais pas ces objets, je ne sais pas, ...

    c'est une erreur de syntaxe, tu manipules des variants, faut que je consulte http://laurent-dardenne.developpez.com/articles/wmi-p1/
    pour vérifier ton utilisation de ces variants ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    dsl mais c'est la seule manière que j'ai trouver qui fonctionne ou que j'ai réussi a faire fonctionner. Si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := ArrayVariant.EnableDHCP(value);
    ce qui active le DHCP avec WMI cela fonctionne. Mais si je remet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Properties := 'EnableDHCP';
    Result := ArrayVariant.Properties(value);
    il me renvoie erreur et me dit Méthode Properties non supportée... Je veux juste qu'il voit Properties comme une variable et mette ce qu'il se trouve dedan et pas Properties comme methode...

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 001
    Par défaut
    J'ignore ton niveau, mais la programmation c'est pas de la magie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := ArrayVariant.EnableDHCP(value);
    au mieux tu écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Properties := 'EnableDHCP';
    Result := TFuncType(ArrayVariant.GetFunction(Properties))(value);
    à toi de trouver le TFuncType ... à mon avis, tu cherche une chose impossible, en RTTI, avec MethodAdress, il y a des choses possibles, mais avec les variants et les interfaces, j'en doute ... en plus utiliser des chaines pour augmenter l'infiabilité d'un code pour identifier des fonctions proprements défini, je trouve cela étrange ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    salut,
    En regardant rapidement ton code, je trouve que tu te complique la vie!
    De plus, je sais pas ce que le paramètre "Instance" est sensé fournir, en faite je l'aurais plutot appele "SQL" ou "Requete" car il s'agit bien d'une requete WQL dans ton cas, que ExecSQL attent.

    donc pourquoi ne pas écrire plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
     (...)
     ObjSet: SWbemObjectSet;
     (...)
    begin
     (...)
     ObjSet := WmiService.ExecSQL('select * from Win32_LogicalDisk', 'WQL', wbemFlagReturnImmediately, nil);
     (...)
    et ensuite enumerer ce set, recupere les objets et enfin leurs proprietes?

  9. #9
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    voila une autre fonction que j'ai fai et qui fonctionne
    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
    function setWMI(Requete, Properties, Item, Value : String) :Integer;
    var
      WmiLocator:          TSWbemLocator;
      WmiService:          SWbemServices;
      WmiObject,
      WmiObjectInProperties,
      WmiObjectOut:        SWbemObject;
      WmiObjectMethod:     ISWbemMethod;
      WmiProperty:         SWbemProperty;
     
      ArrayVariant,
      ArrayValue:           OleVariant;
    begin
      WmiLocator:= TSWbemLocator.Create(nil);
      try
        Screen.Cursor := crAppStart;
        // Connexion WMI (PCName, 'ROOT\CIMV2', UserName, UserPassword, '', '', ...)
        WmiService := WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                              '', wbemConnectFlagUseMaxWait, nil);
        WmiObject := WmiService.Get(Requete, 0, Nil);
        WmiObjectMethod := WmiObject.Methods_.Item(Properties, 0);
        WmiObjectInProperties := WmiObjectMethod.InParameters.SpawnInstance_(0);
        WmiProperty := WmiObjectInProperties.Properties_.Item(Item,0);
        ArrayValue := Value;
        WmiProperty.Set_Value(ArrayValue);
        WmiObjectOut := WmiObject.ExecMethod_(Properties, WmiObjectInProperties,
                                              wbemFlagReturnWhenComplete, Nil);
        ArrayVariant := WmiObjectOut.Properties_.Item('ReturnValue', 0);
     
        Result := ArrayVariant.Value;
     
        Screen.Cursor:= crDefault;
      Finally;
        WmiLocator.Disconnect;
        WmiLocator.Free;
      end;
    end;
    Si je fai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setWMI('Win32_Process', 'Create', 'CommandLine', 'cmd')
    sa fonctionne sans problème mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setWMI('Win32_WindowsProductActivation', 'SetProductKey', 'ProductKey', 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX')
    il me renvoie paramètre de methode non valide et pourtant avec la fonction que j'avai fai plus haut cela fonctionait parfaitement et je l'ai fais en vbs sans problème aussi... J'ai essayer de le faire en C++ je n'arrive pas et en delphi sa va mieux mais j'arrive toujours pas...
    Si quelqu'un voit l'erreur merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] passage de variable avec la methode $_GET
    Par cyrilherve dans le forum Langage
    Réponses: 7
    Dernier message: 19/03/2009, 12h11
  2. Methode GET avec variable
    Par Carb0 dans le forum Langage
    Réponses: 3
    Dernier message: 29/12/2008, 11h01
  3. Réponses: 4
    Dernier message: 08/10/2007, 11h27
  4. set timeout et function avec variable
    Par darkbob dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/06/2007, 07h49
  5. Passage de variable avec la méthode POST
    Par lama85 dans le forum Langage
    Réponses: 2
    Dernier message: 07/09/2006, 11h12

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