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 confirmé
    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
    Points : 523
    Points
    523
    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 confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    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 confirmé
    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
    Points : 523
    Points
    523
    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