| 

.NET C# Java Javascript Exception

4
Ich stecke gerade etwas in der Klemme. Ich schreibe gerade einen Test, bei dem ein Testregistryschlüssel in die Registry geschrieben, gelesen und in eine Datei geschrieben wird (so als würde man diesen Schlüssel exportieren). Mein Problem ist: Es gibt ja auch den Typ REG_EXPAND_SZ. Wenn ich diesen Wert schreibe, alles kein Problem. Will ich ihn jedoch lesen und in eine Datei schreiben, dann habe ich das Problem.

Würde ich denselben Wert exportieren, kommt (in Hexadezimalzahlen) was vollkommen anderes heraus, als wenn ich das mit meinem aktuellen Programm lese. Angenommen, ich habe einen Wert mit dem Namen TestExpandString mit dem Wert "Dies ist ein %PATH%". Dann kommt beim Export genau das in hexadezimalen Zahlen, wenn ich diesen Wert lese, dann übergibt er mir statt %PATH% den Wert von %PATH%.

Mein Code zum Lesen von einem Wert des Typs REG_EXPAND_SZ sieht folgendermaßen aus:
case RegistryValueKind.ExpandString:
string addexpstr = String.Format("\"{0}\"=hex(2):{1}", values2[k], ConvertToHex(basekey.GetValue(values2[k]).ToString()));
erg.Add(addexpstr);
break;


Ich schreibe den Wertnamen (values2[k]) und dessen Wert (basekey.GetValue(values2[k]).ToString()) in Hexadezimalzahlen (dafür ist die selbstgeschrieben Funktion ConvertToHex zuständig).
erg ist eine Liste vom Typ String.
16.01.2012
starki 603 1 8
Ich frag mich nur, warum ich mir mit meiner Antwort so viel Mühe gebe wenn nicht einmal ein Feedback kommt.
Von ner Bewertung ganz zu schweigen :/
Floyd 23.01.2012
Weil ich leider - krankheitsbedingt - noch nicht dazu gekommen bin, das ganze auszutesten. Ich gebe dir Feedback, sobald ich noch dazu komme. Versprochen ;)
starki 23.01.2012
Oh, dann gute Besserung!
Floyd 23.01.2012
Danke :) Jetzt gehts mir wieder besser ... Ich hoffe dir noch diese Woche Rückmeldung zu geben ... da ich auch immer dankbar für jeden bin, der sich hilfsbereit zeigt und sich auch die Zeit dafür nimmt :)
starki 23.01.2012
1 Antwort
2
Was auch vollkommen richtig ist. Laut MSDN:

RegistryValueKind.ExpandString ist eine (...) auf NULL endende Zeichenfolge, die nicht erweiterte Verweise auf Umgebungsvariablen (z. B. %PATH%) enthält, die bei Abruf des Werts erweitert werden. Dieser Wert entspricht dem Win32-API-Registrierungsdatentyp REG_EXPAND_SZ.

const string keyName= "HKEY_CURRENT_USER\_TestExpand";

Registry.SetValue(keyName, "TestExpand1", "%path%", RegistryValueKind.String);
Registry.SetValue(keyName, "TestExpand2", "%path%", RegistryValueKind.ExpandString);

string valTestExpand1 = (string) Registry.GetValue(keyName, "TestExpand1", "DefaultValue");
string valTestExpand2 = (string) Registry.GetValue(keyName, "TestExpand2", "DefaultValue");

Console.WriteLine("TestExpand1: {0}...", valTestExpand1); //TestExpand1: %path%...
Console.WriteLine("TestExpand2: {0}...", valTestExpand2); //TestExpand2: C:\Perl\site.....

Wenn ich das richtig verstanden habe willst du aber das RAW-Value des Registry-Keys. Das geht mit den Registry-Funktionen des .Net leider nicht. Dazu musst du die API-Funktion RegQueryValueEx bemühen.

// This signature will not get an entire REG_BINARY value. It will stop at the first null byte.
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "RegQueryValueExW", SetLastError = true)]
static extern int RegQueryValueEx(
UIntPtr hKey,
string lpValueName,
int lpReserved,
out uint lpType,
System.Text.StringBuilder lpData,
ref uint lpcbData);

Und hier ein Beispiel aus pinvoke.
uint pvSize = 1024;
System.Text.StringBuilder pvData = new System.Text.StringBuilder(1024);
uint pdwType = 0;
int success = RegQueryValueEx(regKey, "AKeyName", 0, out pdwType, pvData, ref pvSize);
16.01.2012
Floyd 14,6k 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH