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 .NET Discussion :

Problème avec QueryServiceConfig [Bug report]


Sujet :

Delphi .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Juillet 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 128
    Par défaut Problème avec QueryServiceConfig
    J'essaie d'utiliser QueryServiceConfig et pour cela je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    size:=marshal.SizeOf(typeof(TQueryServiceConfig));
          if QueryServiceConfig(FServiceHandle,config,size,size) then
          begin
            if config.dwStartType=SERVICE_DEMAND_START then
              rdModeStart.ItemIndex:=0
            else if config.dwStartType=SERVICE_AUTO_START then
              rdModeStart.ItemIndex:=1;
          end
    Mais à chaque fois QueryServiceConfig renvoie FALSE. Et config ne contient pas toutes les données et notamment le nom du service.

    Comment puis-je faire?

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    D'après le code Win32 http://delphi.developpez.com/faq/?pa...ntroservicesnt je pense qu'il faut que tu utilises un pointeur sécurisé ( je ne suis pas certain du terme).

    Un exemple en C# http://www.pinvoke.net/default.aspx/...iceConfig.html

    Ensuite recherche, dans la VCL .NET, l'usage de Marshal.PtrToStructure.

  3. #3
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Juillet 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 128
    Par défaut
    Après de nombreux tests divers et variés j'ai enfin trouvé la solution : redéclarer correctement OpenService et OpenSCManager ainsi que QueryServiceConfig. Voila le code fonctionnant :

    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
     
    function MyQueryServiceConfig(hService: IntPtr;
      lpServiceConfig: IntPtr; cbBufSize: DWORD;
      out pcbBytesNeeded: DWORD): BOOL;
    function MyOpenSCManager(lpMachineName, lpDatabaseName: string;
      dwDesiredAccess: DWORD): IntPtr;
    function MyOpenService(hSCManager: IntPtr; lpServiceName: string;
      dwDesiredAccess: DWORD): IntPtr;
     
    implementation
    uses Borland.Vcl.WinSvc,
         system.runtime.InteropServices,
         system.security;
    {$R *.nfm}
     
    [SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'QueryServiceConfig')]
    function MyQueryServiceConfig; external;
    [SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'OpenSCManager')]
    function MyOpenSCManager; external;
    [SuppressUnmanagedCodeSecurity, DllImport(advapi32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'OpenService')]
    function MyOpenService; external;
     
    function TconfDlg.Execute: Boolean;
    var
      newSize:Cardinal;
      config:TQueryServiceConfig;
      conPtr:IntPtr;
      ScH2, SH2: IntPtr;
    begin
      ScH2:=MyOpenSCManager('',nil,SC_MANAGER_ALL_ACCESS);
      try
        SH2:=MyOpenService(ScH2,'MySQL',SERVICE_ALL_ACCESS);
        try
          conPtr:=nil;
          MyQueryServiceConfig(SH2,conPtr,0,newsize);
          conPtr:=Marshal.AllocHGlobal(newSize);
          if MyQueryServiceConfig(SH2,conPtr,newSize,newSize) then
          begin
            config:=TQueryServiceConfig(marshal.PtrToStructure(conPtr,typeof(TQueryServiceConfig)));
            if config.dwStartType=SERVICE_DEMAND_START then
              rdModeStart.ItemIndex:=0
            else if config.dwStartType=SERVICE_AUTO_START then
              rdModeStart.ItemIndex:=1;
          end;
        finally
          Marshal.FreeHGlobal(conPtr);
          CloseServiceHandle(SH2);
        end;
      finally
        CloseServiceHandle(ScH2);
      end;
      Result := showModal=mrOK;
    end;

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    salut,
    pourquoi redéclarer ces fonctions déjà présentes, avec les mêmes attributs, dans l'assembly Borland.Vcl.WinSvc ?

  5. #5
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Juillet 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 128
    Par défaut
    Ben justement si tu regarde de plus près Borland.VCl.WinSvc, elles ne sont pas déclérées de cette façon, les paramètres changent. Et lorsque j'ai testé avec la version de Borland.VCl.WinSvc, cela n'a jamais voulu fonctionner .

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Ok je comprend, je pensais que le pb provenait des attributs et pas du prototype de la fonction
    Tu comptes remonter le bug sur QualityCentral ?

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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