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

VB.NET Discussion :

Problème d'utilisation de RegOpenKeyEx


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut Problème d'utilisation de RegOpenKeyEx
    Bonjour,

    J'essaie de récupérer toutes les valeurs (Sources de données ODBC) sous la clé de registre... mais là, j'appelle au secours !

    Dans le code suivant, la fonctionRegOpenKeyEx échoue toujours (avec par conséquent obtention du message "Non trouvé").

    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
     
    Public Class Form1
     
      Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByVal phkResult As Long) As Long
      Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
      Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
     
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
        Dim str_ExcelFilePathAndName As String
     
     
        OpenFileDialog1.ShowDialog()
        str_ExcelFilePathAndName = OpenFileDialog1.FileName
     
        MsgBox(str_ExcelFilePathAndName)
     
        Const cst_HKEY_LOCAL_MACHINE = &H80000002
        Const cst_KEY_READ = &H20019 '((READ_CONTROL Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
        Const str_KeyName As String = "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources"
     
        EnumRegistryKeys(cst_HKEY_LOCAL_MACHINE, str_KeyName, cst_KEY_READ)
     
      End Sub
     
    Function EnumRegistryKeys(ByVal lng_hKey As Long, ByVal str_KeyName As String, ByVal lng_hKeyRead As Long) As Collection
    ' Enumerate registry keys under a given key and returns a collection of strings
     
      Dim hdl_Handle As Long
      Dim lng_Length As Long
      Dim lng_Index As Long
      Dim str_SubKeyName As String
     
      Const lng_KeyNameLength = 260
     
      ' initialize the result collection
      EnumRegistryKeys = New Collection
     
      ' Open the key, exit if not found
      If Len(str_KeyName) Then
     
        If RegOpenKeyEx(lng_hKey, str_KeyName, 0, lng_hKeyRead, hdl_Handle) Then
          MsgBox("Non trouvé")
          Exit Function
        End If
        '   in all case the subsequent functions use hKey
        lng_hKey = hdl_Handle
     
      End If
     
      Do
        ' this is the max length for a key name
     
        str_SubKeyName = Space$(lng_Length)
        ' get the N-th key, exit the loop if not found
     
        If RegEnumKey(lng_hKey, lng_Index, str_SubKeyName, lng_KeyNameLength) Then
          Exit Do
        End If
     
        ' add to the result collection
        str_SubKeyName = Mid(str_SubKeyName, 1, InStr(str_SubKeyName, vbNullChar) - 1)
        EnumRegistryKeys.Add(str_SubKeyName, str_SubKeyName)
        ' prepare to query for next key
        lng_Index = lng_Index + 1
     
      Loop
     
      ' Close the key, if it was actually opened
      If hdl_Handle Then
        RegCloseKey(hdl_Handle)
      End If
     
    End Function
     
    End Class
    Quelqu'un peut-il me mettre sur la voie ?

    Merci infiniment !
    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  2. #2
    Membre régulier Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Points : 108
    Points
    108
    Par défaut
    Devez-vous vraiment passer par une dll non managée? ne serait-il pas plus simple d'utiliser la classe Registry native ?
    Piet

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Merci pour votre réponse...

    Le problème est que je n'ai pas trouvé de moyen de "browser" toutes les valeurs sous une clé avec la classe Registry native...

    Mais je suis preneur si vous avez une solution de ce type ! :-)

    Amicalement.
    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ben je vois pas pourquoi ce serait plus facile avec l'API native qu'avec la classe RegistryKey...

    Tu as de la chance, justement j'ai fait exactement la même chose il n'y a pas très longtemps (énumérer les sources ODBC)

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            private List<string> EnumDsn(RegistryKey rootKey)
            {
                List<string> list = new List<string>();
                RegistryKey regKey = rootKey.OpenSubKey(@"Software\ODBC\ODBC.INI\ODBC Data Sources");
                if (regKey != null)
                {
                    foreach (string name in regKey.GetValueNames())
                    {
                        string value = regKey.GetValue(name, "").ToString();
                        list.Add(Value);
                    }
                }
                return list;
            }
    (j'ai la flemme de faire la conversion en VB.NET, mais ça ne présente pas de difficulté particulière...)

    Pour utiliser cette fonction, passe en paramètre la clé racine qui t'intéresse (a priori Registry.CurrentUser ou Registry.LocalMachine)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Merci !

    J'essaie ca dès que je peux...

    Amicalement.
    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    j'ai juste fait une petite erreur en adaptant le code avant de le poster... à la place de
    il faut mettre

    En fait, si tu n'as besoin que du nom du DSN et pas du pilote, on peut même simplifier le tout (dans mon code d'origine je filtrais sur le pilote ODBC, d'où la boucle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private List<string> EnumDsn(RegistryKey rootKey)
            {
                List<string> list = new List<string>();
                RegistryKey regKey = rootKey.OpenSubKey(@"Software\ODBC\ODBC.INI\ODBC Data Sources");
                if (regKey != null)
                {
                    list.AddRange(regKey.GetValueNames());
                }
                return list;
            }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Merci infiniment !

    Elle fonctionne très bien cette classe RegistryKey ! J'en ai profité pour passer en C# et je commence à me familiariser avec le framework .NET 3.5...

    Merci encore pour ton aide !

    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Drooxy Voir le message
    J'en ai profité pour passer en C#
    Très bon choix

Discussions similaires

  1. [RTFEditorKit] Problème d'utilisation
    Par jean.lamy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 21/10/2004, 18h30
  2. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  3. [cvs] problèmes d'utilisation
    Par gromite dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 17h41
  4. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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