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

C++Builder Discussion :

Récupérer la liste des services sur C++Builder XE4 [Système/Fichiers/API]


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut Récupérer la liste des services sur C++Builder XE4
    Bonjour,

    Sous C++Builder XE4, je n'arrive pas à récupérer la liste des services.
    Voici une partie de mon code de test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool __fastcall TGestionService1::ConnectToServiceManager(UnicodeString ComputerName, SC_HANDLE__ **SCHandle)
    {
    *SCHandle = OpenSCManager(ComputerName.w_str(), NULL, SC_MANAGER_ALL_ACCESS);
    return (*SCHandle != NULL);
    }
    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
    SC_HANDLE__ *Handle_SCM;
    UnicodeString ComputerName = MyGetComputerName();
    ENUM_SERVICE_STATUS *Mes_Services;
    unsigned long OctetsNecessaires, Nombre_Services;
    try {
        if (ConnectToServiceManager(ComputerName, &Handle_SCM))
           {
           Mes_Services = new ENUM_SERVICE_STATUS[512];
    
           if (EnumDependentServices(Handle_SCM, SERVICE_STATE_ALL, Mes_Services, size_t(Mes_Services), &OctetsNecessaires, &Nombre_Services) != false)
              {
              //Code de récupération
              }
           else {
                int test = GetLastError();
                    MessageDlg(IntToStr((int)test),  System::Uitypes::TMsgDlgType::mtInformation, TMsgDlgButtons(), 0);
                if (test == ERROR_ACCESS_DENIED)
                   {
                   test = ERROR_ACCESS_DENIED;
                   }
                if (test == ERROR_INVALID_HANDLE)
                   {
                   test = ERROR_INVALID_HANDLE;
                   }
                if (test == ERROR_INVALID_PARAMETER)
                   {
                   test = ERROR_INVALID_PARAMETER;
                   }
                if (test == ERROR_MORE_DATA)
                   {
                   test = ERROR_MORE_DATA;
                   }
                if (test == RPC_X_BAD_STUB_DATA)
                   {
                   test = RPC_X_BAD_STUB_DATA;
                   }
                }
           }
        }
    __finally {
                //...
    Dans tous les cas, je récupère la valeur "RPC_X_BAD_STUB_DATA" avec la fonction "EnumDependentServices".

    J'ai vu que ce problème est reconnu par Microsoft mais pour les anciennes versions de Windows. J'utilise Windows 7 64bits.
    http://smallbusiness.support.microso...n-au/kb/822751

    Avez-vous une solution ?

    Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Tu es sûr de ton coup, pour l'appel de EnumDependentServices juste après OpenSCManager ??

    Si j'en crois MSDN, EnumDependentServices attend un handle de service (SC_HANDLE), pas le résultat de OpenSCManager...

    Je viens d'essayer ceci avec EnumServicesStatus, et ça a l'air de pas trop mal marcher:
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    bool __fastcall ConnectToServiceManager(String ComputerName, SC_HANDLE *SCHandle)
    {
      *SCHandle = OpenSCManager(ComputerName.IsEmpty() ? NULL : ComputerName.c_str(), NULL, SC_MANAGER_ALL_ACCESS);
      return (*SCHandle != NULL);
    }
     
    void __fastcall TFormScreen1::Button1Click(TObject *Sender)
    {
      SC_HANDLE Handle_SCM;
      String ComputerName;// = MyGetComputerName();
      ENUM_SERVICE_STATUS *Mes_Services = NULL;
      DWORD OctetsNecessaires, Nombre_Services;
     
      try
      {
        if (!ConnectToServiceManager(ComputerName, &Handle_SCM))
          RaiseLastOSError();
     
        DWORD ResumeHandle = 0;
     
        if (!EnumServicesStatus(Handle_SCM,
                                        SERVICE_TYPE_ALL,
                                        SERVICE_STATE_ALL,
                                        NULL,
                                        0,
                                        &OctetsNecessaires,
                                        &Nombre_Services,
                                        &ResumeHandle))
        {
          if (GetLastError() != ERROR_MORE_DATA)
            RaiseLastOSError();
     
          Mes_Services = (ENUM_SERVICE_STATUS*)(new BYTE[OctetsNecessaires]);
     
          if (!EnumServicesStatus(Handle_SCM,
                                          SERVICE_TYPE_ALL,
                                          SERVICE_STATE_ALL,
                                          Mes_Services,
                                          OctetsNecessaires,
                                          &OctetsNecessaires,
                                          &Nombre_Services,
                                          &ResumeHandle))
            RaiseLastOSError();
     
          String res;
          res.printf(L"Nombre_Services=%d", Nombre_Services);
          ShowMessage(res);
        }
     
      }
      __finally {
                  //...
      }
     
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Merci, tu as parfaitement raison.
    Je ne comprenais pas ce que demandais l'aide liée à l'autocomplétion.

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

Discussions similaires

  1. Récupérer la liste des services à distance ?
    Par pot2yaourt dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/12/2009, 09h39
  2. Réponses: 0
    Dernier message: 08/12/2008, 17h49
  3. Réponses: 22
    Dernier message: 29/03/2007, 22h51
  4. Réponses: 1
    Dernier message: 12/10/2006, 16h48
  5. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41

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