Autor Beitrag
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 :nixweiss: .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 15.05.10 13:40 
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Irgendwelche Dinge zum Thema Rechte, die ich beachten muss?
Mit der Standard-UAC:
ausblenden 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


user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Wie gesagt, ich habe dummerweise kein 64Bit-Windows.
Wenn du noch eine Frage hast, teste ich das gerne :) .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 17.05.10 06:52 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden F#
1:
> Registry.LocalMachine.OpenSubKey("SOFTWARE", writable = false).SubKeyCount;;					

Hm, genau diese Aufrufart habe ich aber versucht. Mal ein ganz praktisches Beispiel:
ausblenden 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:
ausblenden F#
1:
> RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE", writable = false).SubKeyCount;;					

probieren.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 17.05.10 19:09 
user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:
Beim Test von jemand, der ein 64Bit-Win7 hat, blieb der Pfad leer.
Kann ich bestätigen :) . Im x86-Key ist zwar auch einiges drin, aber kein LocalStore:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0]
"AppRoot"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\"
"LocalStore"="C:\\ProgramData\\Microsoft\\HelpLibrary\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0\CatalogInfo]
"vs_100_en-us"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\CatalogInfo\\vs_100_en-us.cab"

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0]
"AppRoot"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\LibManShortcut]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\LibManShortcut\1033]
"installed"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\Setup]
"AppRoot"="C:\\Program Files\\Microsoft Help Viewer\\v1.0\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\Setup\1033]
"Version"="1.0.30319"
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\VSDocsShortcut]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v1.0\VSDocsShortcut\1033]
"installed"=dword:00000001

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 18.05.10 07:03 
Und bekommst du so ein Ergebnis?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 18.05.10 10:19 
Japp, unter x86 und natürlich auch AnyCPU :) .

_________________
>λ=
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 18.05.10 19:22 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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.