Meilleur auteur de réponses
RegistryKey avec VB .NET 2008 Express et VB .NET 2010 Express

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
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- Proposé comme réponse Gilles TOURREAUModerator mercredi 26 janvier 2011 10:11
- Marqué comme réponse Alex Petrescu vendredi 28 janvier 2011 10:08
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 EnglishDim 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 -
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 -
@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)
-
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- Proposé comme réponse Gilles TOURREAUModerator mercredi 26 janvier 2011 10:11
- Marqué comme réponse Alex Petrescu vendredi 28 janvier 2011 10:08
-