Autor |
Beitrag |
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.05.10 08:13
Hallo. Ich brauche mal etwas theoretische Hilfe.
Ich überarbeite gerade ein kleines Projekt, das zwingend auf die Registry unter "HKEY_LOCAL_MACHINE" zugreifen muss. Mit meinem XP-32Bit klappt das. Unter 64Bit funktioniert es nicht mehr. Ich kann es nicht selbst prüfen, weil ich kein 64Bit-OS habe und mir auch in der nächsten Zeit keines installieren werde.
Die Frage: Im .NET Framework 4 scheint es Funktionen zu geben, mit denen man die Version wählen kann, so dass das Auslesen von Werten möglich sein wird. Was haben aber Entwickler unter XP-64Bit oder Vista-64Bit bisher gemacht, als sie mit dem 3er-Framework arbeiten mussten und deren Programme unter Umständen auch auf die Registry zugreifen mussten?
Ich brauche also lediglich ein paar Anregungen.
Herzlichen Dank.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 14.05.10 12:32
Eigentlich werden ja nur Keys umgeleitet, von denen Microsoft dachte, dass eine x86- und eine x64-Anwendung sowieso kein gemeinsames Interesse haben könnten (/CLSID zum Bleistift). Ich fürchte, da wirst du über P/Invoke gehen müssen  .
_________________ >λ=
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.05.10 19:05
Dann muss ich vermutlich doch auf das 4er-Framework wechseln. Irgendwelche Dinge zum Thema Rechte, die ich beachten muss? Ich hatte sonst immer
C#-Quelltext 1:
| RegistryKey hklm = Registry.LocalMachine.OpenSubKey("Pfad", false); |
das "false", um den Schlüssel nicht gleich im Vollzugriff aufzumachen. Im Moment nehme ich gerade
C#-Quelltext 1:
| RegistryKey hklm = Registry.LocalMachine.OpenSubKey("Pfad", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey); |
Wie gesagt, ich habe dummerweise kein 64Bit-Windows. Und die Prioritäten liegen auch woanders. Zumal ich mir dann erst mal den passenden Prozessor einsetzen müsste.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 15.05.10 13:40
MathiasSimmack hat folgendes geschrieben : | Irgendwelche Dinge zum Thema Rechte, die ich beachten muss? |
Mit der Standard-UAC:
F# 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| > Registry.LocalMachine.OpenSubKey("SOFTWARE", writable = false).SubKeyCount;; val it : int = 75 > RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE", writable = false).SubKeyCount;; val it : int = 23 > Registry.LocalMachine.OpenSubKey("SOFTWARE", writable = true).SubKeyCount;; System.Security.SecurityException: Requested registry access is not allowed. at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) at <StartupCode$FSI_0010>.$FSI_0010.main@() The Zone of the assembly that failed was: MyComputer Stopped due to error > RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE", writable = true).SubKeyCount;; System.Security.SecurityException: Requested registry access is not allowed. at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) at <StartupCode$FSI_0011>.$FSI_0011.main@() The Zone of the assembly that failed was: MyComputer Stopped due to error |
MathiasSimmack hat folgendes geschrieben : | Wie gesagt, ich habe dummerweise kein 64Bit-Windows. |
Wenn du noch eine Frage hast, teste ich das gerne  .
_________________ >λ=
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 17.05.10 06:52
Kha hat folgendes geschrieben : | F# 1:
| > Registry.LocalMachine.OpenSubKey("SOFTWARE", writable = false).SubKeyCount;; | |
Hm, genau diese Aufrufart habe ich aber versucht. Mal ein ganz praktisches Beispiel:
C#-Quelltext 1: 2: 3: 4:
| RegistryKey hklm = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Help\v1.0", false); string localStore = (string)hklm.GetValue("LocalStore", string.Empty); hklm.Close(); return localStore; |
Liefert bei meinem 32Bit-XP ohne Probleme den Pfadnamen zu den installierten Hilfedokumenten. Beim Test von jemand, der ein 64Bit-Win7 hat, blieb der Pfad leer. Und dann kam die Exception, weil ich versucht habe, den leeren Pfad mit dem Ordnernamen "manifest" zu kombinieren, den ich benötige, um dort ein paar Dateien auszulesen. Entweder wurde "string.Empty" geliefert, weil sie den echten Wert nicht auslesen konnte (vorhanden war er!). Oder die Funktion flog bei "catch" raus und hatte deshalb "string.Empty" als Ergebnis.
Ich werde aber noch mal diese Variante
Zitat: | F# 1:
| > RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE", writable = false).SubKeyCount;; | |
probieren.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 17.05.10 19:09
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 18.05.10 07:03
Und bekommst du so ein Ergebnis?
C#-Quelltext 1: 2: 3: 4:
| RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(@"SOFTWARE\Microsoft\Help\v1.0", false); string localStore = (string)hklm.GetValue("LocalStore", string.Empty); hklm.Close(); return localStore; |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 18.05.10 10:19
Japp, unter x86 und natürlich auch AnyCPU  .
_________________ >λ=
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 18.05.10 19:22
Kha hat folgendes geschrieben : | Japp, unter x86 und natürlich auch AnyCPU . |
Sehr schön. Dann mache ich mal ein Häkchen an das Thema.
Danke für die Mithilfe.
|
|