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

Windows Forms Discussion :

VB2005EE et classe registry


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 25
    Par défaut VB2005EE et classe registry
    Bonjour à toutes et tous !

    Je coagule depuis 2 jours sur un problème avec une API windows. Elle me retourne régulièrement une erreur 87 (paramètre invalide). Malgré de nombreuses recherches, je n'ai trouvé que des codes identiques, et aucune réelle explication sur KeyOpenRegEx ... Peut-être vos yeux tout neufs et votre expérience pourront-ils m'aider à débloquer la situation ?

    Je mets le code dessous (uniquement la partie concernée), et s'il vous plaît, soyez indulgents, je suis un vrai débutant !

    Pour Info, le but est de lister tester la présence de SQL Express Edition, son numéro de version, et le cas échéant, les instances SQL installées ... Dans ce code, la variable "lngResult", résultat de l'ouverture de la clé, renvoie toujours la valeur 87...

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    Option Explicit On
     
    Imports System
    Imports System.IO
    Imports System.Text
    Public Class DetectMSDE
     
    'Déclaration des fonctions de l'API
     
        Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
            Alias "RegOpenKeyExA" _
            (ByVal hKey As Integer, _
            ByVal lpSubKey As String, _
            ByVal ulOptions As Integer, _
            ByVal samDesired As Integer, _
            ByVal phkResult As Integer) As Integer
     
        Private Declare Function RegEnumValue Lib "advapi32.dll" _
            Alias "RegEnumValueA" _
            (ByVal hKey As Long, _
            ByVal dwIndex As Long, _
            ByVal lpValueName As String, _
            ByVal lpcbValueName As Long, _
            ByVal lpReserved As Long, _
            ByVal lpType As Long, _
            ByVal lpData As String, _
            ByVal lpcbData As Long) As Long
     
        Private Declare Function RegCloseKey Lib "advapi32.dll" _
            (ByVal hKey As Long) As Long
     
    'Déclaration des constantes de l'API
     
        Const HKEY_CLASSES_ROOT = &H80000000
        Const HKEY_CURRENT_USER = &H80000001
        Const HKEY_LOCAL_MACHINE = &H80000002
        Const HKEY_USERS = &H80000003
     
        Const ERROR_SUCCESS = 0&
     
        Const SYNCHRONIZE = &H100000
        Const STANDARD_RIGHTS_READ = &H20000
        Const STANDARD_RIGHTS_WRITE = &H20000
        Const STANDARD_RIGHTS_EXECUTE = &H20000
        Const STANDARD_RIGHTS_REQUIRED = &HF0000
        Const STANDARD_RIGHTS_ALL = &H1F0000
        Const KEY_ALL_ACCESS = &H3F
        Const KEY_QUERY_VALUE = &H1
        Const KEY_SET_VALUE = &H2
        Const KEY_CREATE_SUB_KEY = &H4
        Const KEY_ENUMERATE_SUB_KEYS = &H8
        Const KEY_NOTIFY = &H10
        Const KEY_CREATE_LINK = &H20
        Const KEY_READ = ((STANDARD_RIGHTS_ALL Or _
                            KEY_QUERY_VALUE Or _
                            KEY_ENUMERATE_SUB_KEYS Or _
                            KEY_NOTIFY) And (Not SYNCHRONIZE))
        Const REG_DWORD = 4
        Const REG_BINARY = 3
        Const REG_SZ = 1
     
    'Déclenchement de la détection (lecture du registre)
     
        Private Sub TestDirV9(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
     
            Dim lngKeyHandle As IntPtr
            Dim lngResult As Long
            Dim lngCurIdx As Long
            Dim strValue As String
            Dim lngValueLen As Long
            Dim lngData As Long
            Dim lngDataLen As Long
            Dim strResult As String
     
    ' Ouverture de la clé concernée
     
            lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", _
                                     0&, _
                                     KEY_READ, _
                                     lngKeyHandle)
     
            If lngResult <> ERROR_SUCCESS Then
                MsgBox("Impossible d'ouvrir la clé.")
                Exit Sub
            End If

  2. #2
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 25
    Par défaut Modification, sans résolution ...
    Bonjour,

    J'ai remplacé la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
                        "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", _
                        0, _
                        KEY_READ, _
                        lngKeyHandle)
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
                        "\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", _
                        0, _
                        KEY_READ, _
                        lngKeyHandle)
    Mais sans succès, bien que ce soit également une véritable erreur dans mon code d'origine ...

    Un début de soupçon de piste à me soumettre ?

    Oliver

  3. #3
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Pourquoi tu ne passes par les classes du Framework prévues pour accéder au registre ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  4. #4
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 25
    Par défaut Ben ...
    Simplement parce que je n'ai pas trouvé d'infos à ce sujet ! Même si le web regorge d'informations, trouver la bonne, la plus judicieuse, et surtout, comment l'exploiter, n'est pas évident !

    As-tu une piste, où je pourrais justement trouver ces informations ? L'aide en ligne est efficace, mais ne sachant pas trop où aller, pas évident de faire la recherche qui m'enverra les bonnes infos ...

    Merci pour ta réponse !

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 25
    Par défaut Bon, Alors !
    Re !

    Je me suis penché plus avant sur les classes du framework ...

    Et j'ai commencé à générer un code comme celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim DirV9 As String = Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Microsoft SQL Server\90", "VerSpecificRootDir", Nothing)
            Dim VerV9 As String = Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Microsoft SQL Server\90\BootStrap\Setup", "PatchLevel", Nothing)
            Dim CleSQL As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\MICROSOFT\Microsoft SQL Server\90\Instance Names\SQL")
            Dim Cleok As Integer = CleSQL.SubKeyCount()
            MsgBox("Clé : " & Cleok)
    Mais ... à l'exécution, j'ai un message d'erreur, qui me dit :


    L'exception System.NullReferenceException n'a pas été gérée
    Message="La référence d'objet n'est pas définie à une instance d'un objet."

    On me dit : D'utiliser le mot clé "new" pour créer une instance d'objet;
    et/ou : de déterminer si l'objet est null avant d'appeler la méthode.

    Et effectivement, je ne parviens pas afficher la valeur ou le retour de CleSQL ni de Cleok ...

    Je patauge vraiment ... quelqu'un pourrait-il m'aiguiller ???

    Merci ...

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 25
    Par défaut On avance !
    Après de nombreux essais, j'arrive à obtenir (presque) tout ce que je veux; à un détail près ...

    En effet, j'arrive à bien ouvrir ma clé dans la base de registre; j'en liste bien les valeurs, et j'arrive à obtenir leurs contenus. Mais ...

    Par exemple, la valeur affichée dans la base de registre est : MSSQL.1, moi, j'obtiens M, puis S, puis S ... et ainsi de suite. Je suppose que cela vient de ma boucle, ou de ma façon de lire la valeur ...

    J'avoue qu'un peu d'aide serait bienvenue !

    Voici le code (à ce sujet, si vous avez des critiques au des suggestions, je suis également preneur; c'est bien ainsi que j'apprendrai !)

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    Public Class DetectMSDE
     
        'Clic sur le bouton "Détecter"
        Private Sub TestDirV9(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            'Collecte des infos sur le msde 2000
            Dim DirV8 As String = Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\80\Tools\ClientSetup", "SQLPath", Nothing)
            Dim VerV8 As String = Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Microsoft SQL Server\80\Tools\ClientSetup\CurrentVersion", "CurrentVersion", Nothing)
            'Collecte des infos sur sql express édition
            Dim DirV9 As String = Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Microsoft SQL Server\90", "VerSpecificRootDir", Nothing)
            Dim VerV9 As String = Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Microsoft SQL Server\90\BootStrap\Setup", "PatchLevel", Nothing)
            'Ouverture de la clé qui contient les instances SQL Express
            Dim CleSQLinstance As RegistryKey = Registry.LocalMachine
            Dim CleSQL As RegistryKey = CleSQLinstance.OpenSubKey("SOFTWARE")
            Dim CleSQL1 As RegistryKey = CleSQL.OpenSubKey("MICROSOFT")
            Dim CleSQL2 As RegistryKey = CleSQL1.OpenSubKey("Microsoft SQL Server")
            Dim CleSQL3 As RegistryKey = CleSQL2.OpenSubKey("Instance NAMES")
            Dim CleSQL4 As RegistryKey = CleSQL3.OpenSubKey("SQL")
            'on compte les instances contenues
            Dim CleSQLnb As Integer = CleSQL4.ValueCount()
     
            ' On récupère les noms de chaque valeur (les instances)
            For Each NomCleSQL As String In CleSQL4.GetValueNames()
     
                ' On récupère le contenu de chaque valeur
                For Each ValeurCleSQL As String In CleSQL4.GetValue(NomCleSQL)
     
                    ' On ajoute les deux informations dans la ListBox
                    Dim instsql As String = "- " & NomCleSQL & " / " & ValeurCleSQL & "- "
                    Me.ListBox1.Items.Add(instsql)
                Next
            Next
     
            ' Affichage des infos dans le Form
     
            ' Si DirV8 n'existe pas ...
            If DirV8 Is Nothing Then
                Me.DirV8TextBox.Text = "MSDE 2000 Non Installé"
                Me.VerV8TextBox.Text = "MSDE 2000 Non Installé"
                Me.Label6.Enabled = False
                Me.Label7.Enabled = False
                Me.Label8.Enabled = False
            Else
                ' Si DirV8 existe ...
                Dim LongDirV8 As Integer = DirV8.Length
                Dim V8Dir As String = DirV8.Remove(46 - 5, 5)
                'V8Dir = DirV8.Remove(46 - 5, 5)
                Me.DirV8TextBox.Text = V8Dir
                Me.VerV8TextBox.Text = VerV8
            End If
     
            ' Si DirV9 n'existe pas ...
            If DirV9 Is Nothing Then
                Me.DirV9TextBox.Text = "SQL Express Non Installé"
                Me.VerV9TextBox.Text = "SQL Express Non Installé"
                Me.Label2.Enabled = False
                Me.Label4.Enabled = False
                Me.Label5.Enabled = False
            Else
                ' Si DirV9 existe ...
                Me.DirV9TextBox.Text = DirV9
                Me.VerV9TextBox.Text = VerV9
            End If
     
            ' Activation et Focus du bouton "SUIVANT"
            Me.Button5.Enabled = True
            Me.Button5.Focus()
     
        End Sub

Discussions similaires

  1. [Débutant] Classe WMI à utiliser pour les événements de Registry ?
    Par mikedavem dans le forum C#
    Réponses: 0
    Dernier message: 16/06/2011, 14h31
  2. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  3. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  4. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21
  5. Creation d une clee dans la registry en VC++
    Par rico27fr dans le forum MFC
    Réponses: 4
    Dernier message: 30/05/2002, 12h36

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