none
RegistryKey avec VB .NET 2008 Express et VB .NET 2010 Express RRS feed

  • Question

  • English version at the end of the mail (and excuse me for my english)

     

    Bonjour,

     

    Il y a 1 ligne de commande qui fonctionne correctement avec VB .Net 2008 Express, mais qui lève une exception avec VB .Net 2010 Express.

     

    Dim lm_key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine

    With variables.strings

         .chemin_installation = lm_key.OpenSubKey(.chemin_reg).GetValue(.chemin_installation_reg)

    End With

     

    Les chaines de caractères sont déclarées convenablement et contiennent des valeurs valides.

    En VB .Net 2008 Express, le programme me retourne la valeur correcte.

    La même commande en VB .Net 2010 Express lève une exception

    ex.Message retourne :

    La référence d'objet n'est pas définie à une instance d'un objet.

    En mode débug, je teste avec le mode espion, la 1ère sous clef pose directement le problème.

    Pour info, .chemin_reg = "Software\Nom de la société\Nom du programme"

    j'ai essayé SOFTWARE, j'ai également essayé de doubler les \, j'ai essayé les /, et essayé de doubler les /, mais rien n'y fait.

    J'ai également essayé de tester ainsi :

     

    lm_key.OpenSubKey("Software").OpenSubKey("Nom de la société")

    mais cela ne fonctionne toujours pas mieux.

     

    Pour toujours info, j'ai pris l'habitude de coder avec les options Explicit, Strict et Infer tous 3 à ON et je considère également tous les avertissements comme des erreurs.

     

    Le truc bizarre que je vois avec l'espion dans la version 2010, c'est que lm_key.OpenSubKey("Software") retourne 43 sous-clefs alors que je n'en ai qu'une vingtaine. Ce nombre ne correspond pas non plus avec Current User qui compte une cinquantaine de sous-clefs sous Software.

     

    Bref, je suis un peu perdu, je n'y comprends plus rien et je ne sais plus quoi faire, à part continuer sur la version 2008 qui elle, je le rappelle, fonctionne très bien.

     

    Merci d'avance pour vos réponses.

    Stéphane

     

    _________________

     

     

     

    Hello,

     

    There is a line command wich doesn't work correctly with VB .Net 2008 Express, but wich occurs an exception with VB .Net 2010 Express.

     

    Dim lm_key As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine

    With vars.strings

         .path_installation = lm_key.OpenSubKey(.path_reg).GetValue(.path_installation_reg)

    End With

     

    The strings are declared convenably and have valids values.

    With VB .Net 2008 Express, the program send me a correct value.

    The same command with VB .Net 2010 Express occurs an exception

    ex.Message send :

    La référence d'objet n'est pas définie à une instance d'un objet.

    (The object reference isn't defined as an object instance)

    In debug mode, I test with the spy mode, the first subkey cause directly the problem.

    For information, .chemin_reg = "Software\Name of the society\Name of the program"

    I tried SOFTWARE, I also tried to double the \, I tried the /, and tried to double the /, but nothing works.

    I also tried to test thse one :

     

    lm_key.OpenSubKey("Software").OpenSubKey("Name of the society")

    but it doesn't work anymore.

     

    Always for information, I always program with the 3 options Explicit, Strict and Infer to ON and I also consider all the warnings as errors.

     

    The strange thing I see with the spy in the version 2010, is lm_key.OpenSubKey("Software") sends 43 subkeys but I only have near 20. This number doesn't correspond either with Current User wich count neart 50 subkeys under Software.

     

    So, I am a little lost, I don't understand anything and I don't know what to do, except continue on the version 2008 wich, I say it again, work fine.

     

    Thanks for your answers.

    Stéphane


     

    vendredi 21 janvier 2011 15:18

Réponses

  • Bonjour,

    OK. Alors sur une machine 64-bit, lorsque vous lisez la clé "SOFTWARE\Microsoft\Windows\CurrentVersion". vous utilisez :

    • SOFTWARE\Microsoft\Windows\CurrentVersion si l'application fonctionne en 64-bit
    • SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion si l'application fonction en 32-bit

    Si vous devez forcement lire la clé dédié pour les applications 64-bit (même si l'application est en 32-bit) vous pouvez dans le .NET Framework 4.0 utilisez l'énumération RegistryView :

        Using baseKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
          Using subKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion")
    
            Dim s As String
            s = subKey.GetValue("ProgramFilesPath")
    
          End Using
        End Using
    

    Après si le but de votre code est de récupérer le répertoire Program Files il suffit de faire tout simplement :

    Dim s As String
    
        ' Répertoire Program Files
        s = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
    
        ' Répertoire Program Files (x86)
        s = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 24 janvier 2011 13:06
    Modérateur

Toutes les réponses

  • Bonjour,Hello ,

    Désoler j'ai pas tout compris car je parle très peu l'anglais
    Sorry I have not completely understood , because I speak very little English

        Dim oMyBaseRegistry As Microsoft.Win32.RegistryKey = My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion")
        Dim oValueKey = oMyBaseRegistry.GetValue("ProgramFilesPath")
        MsgBox(oValueKey)
    

    Pour ce qui me concerne le code suivant fonctionne
    In
    my case the following code works

     


    Cordialement, Troxsa
    samedi 22 janvier 2011 16:33
  • Bonjour,

    Etes-vous sous un environnement 64-bit lorsque vous utilisez Visual Basic .NET 2010 ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 23 janvier 2011 13:30
    Modérateur
  • @Troxsa : merci, je vais regarder si ca change quelque chose

    Edit : sur la 1ère ligne, oMyBaseRegistry retourne Nothing comme si le chemin n'existait pas et la 2e ligne lève toujours la même exception (étant donné que oMyBaseRegistry = Nothing)


    @Gilles : merci, en effet, c'est 1 chose que j'ai oublié de signaler, désolé... oui, je suis sous win 7 64 bits, et sur cet os, j'ai les 2 versions de vb, le 2008 express et le 2010 express (il est vrai que RegistryKey est sous Microsoft.Win32, mais je n'ai pas trouvé de Win64, ni de Registry64, ni de RegistryKey64)

     

     

    lundi 24 janvier 2011 10:17
  • Bonjour,

    OK. Alors sur une machine 64-bit, lorsque vous lisez la clé "SOFTWARE\Microsoft\Windows\CurrentVersion". vous utilisez :

    • SOFTWARE\Microsoft\Windows\CurrentVersion si l'application fonctionne en 64-bit
    • SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion si l'application fonction en 32-bit

    Si vous devez forcement lire la clé dédié pour les applications 64-bit (même si l'application est en 32-bit) vous pouvez dans le .NET Framework 4.0 utilisez l'énumération RegistryView :

        Using baseKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
          Using subKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion")
    
            Dim s As String
            s = subKey.GetValue("ProgramFilesPath")
    
          End Using
        End Using
    

    Après si le but de votre code est de récupérer le répertoire Program Files il suffit de faire tout simplement :

    Dim s As String
    
        ' Répertoire Program Files
        s = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
    
        ' Répertoire Program Files (x86)
        s = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 24 janvier 2011 13:06
    Modérateur
  • Merci Gilles, je vais regarder en allant dans WOW (je me disais aussi, bizarre, j'ai pas installé WOW :p)

    Pour info, je ne vais pas dans CurrentVersion (ni dans Microsoft), mais la logique reste la même

    mardi 25 janvier 2011 09:14