Registryeintraege schreiben, fehlende hex zeichen
-
Was steht eigentlich in deinem NetValue-Array? Die IP-Adresse in String-Form? Oder die binär (4 Byte)? Und hat dein anzugebender Registry-Eintrag eine feste Länge?
-
Das Array ist so definiert: PSTR NetValueArray[6];
In das Array schreibe ich die IpAdressen die ich aus dem QueryString des Browsers auslese.
-
mrkorn schrieb:
In das Array schreibe ich die IpAdressen die ich aus dem QueryString des Browsers auslese.
Das heißt, in Testform?
PS: Willst du immer genau drei 0-Werte am Ende des Eintrags haben? Oder hängt die Anzahl davon ab, wie lang die Adressangabe ist?
-
CStoll schrieb:
mrkorn schrieb:
In das Array schreibe ich die IpAdressen die ich aus dem QueryString des Browsers auslese.
Das heißt, in Testform?
PS: Willst du immer genau drei 0-Werte am Ende des Eintrags haben? Oder hängt die Anzahl davon ab, wie lang die Adressangabe ist?
In Testform? wie meinst du das?
Ein durch die Windows Ce Einstellungen geschriebener Key mit Ip=123.123.123.123 sieht so aus:
"IP"=hex(7):\ 31,32,33,2e,31,32,33,2e,31,32,33,2e,31,32,33,00,00Ein durch die Windows Ce Einstellungen geschriebener Key mit Ip=1.1.1.1 sieht so aus:
"IP"=hex(7):\ 31,2e,31,2e,31,2e,31,00,00Wenn ich jetzt nur meinen Wert nehme und schreibe habe ich nur:
"IP"=hex(7):\ 31,2e,31,2e,31,2e,31,00Die MSDN Doku sagt aber das Keys als REG_MULTI_SZ geschrieben immer 00,00 am Ende brauchen!
Dies liegt daran das auch mehrere Ips, z.B. in DNS(primary,secondary) gespeichert werden können. Dies sieht dann so aus:"DNS"=hex(7):\ 31,32,33,2e,31,32,33,2e,31,32,33,2e,31,32,33,00,31,32,34,2e,31,32,34,2e,31,\ 32,34,2e,31,32,34,00,00Getrennt werden die einzelnen Keys durch ein einfaches 00 und abgeschlossen wird mit 00,00.
Deshalb versuche ich hier noch ein zusätzliches "\0" an meinen Key der eine beliebige länge hat ranzuhängen und zu schreiben.
-
mrkorn schrieb:
CStoll schrieb:
mrkorn schrieb:
In das Array schreibe ich die IpAdressen die ich aus dem QueryString des Browsers auslese.
Das heißt, in Testform?
PS: Willst du immer genau drei 0-Werte am Ende des Eintrags haben? Oder hängt die Anzahl davon ab, wie lang die Adressangabe ist?
In Testform? wie meinst du das?
Ja, auch mir passieren gelegentlich Tipfehler
das sollte "Textform" heißen.*schaut sich die Beispiele an* Und nach dem letzten Beitrag kann ich die Frage mit 'ja' beantworten.
Deshalb versuche ich hier noch ein zusätzliches "\0" an meinen Key der eine beliebige länge hat ranzuhängen und zu schreiben.
Da hast du dein Problem auch schon - '\0' wird von C als Stringende-Marke interpretiert, deshalb bekommst du Probleme, wenn du C-String-Funktionen (strcat(), strlen() etc) auf etwas loslässt, was Nullwerte als normalen Text enthält. Da mußt du vermutlich direkt in dein Ausgabe-Array schreiben und die fehlende(n) Nullen eintragen:
wcscpy(WriteValue, lpstrSubkeyValue); int len=strlen(NetValueArray[queryCountertrlen]); WriteValue[len]=WriteValue[len+1]=L'\0'; RegSetValueEx(hKey, lpstrSubkey, 0, REG_MULTI_SZ, (LPBYTE)WriteValue, 2*(len+2));
-
Tja wie soll ichs sagen.
Funktioniert Perfekt, Danke.
Hab schnelle einige IPs geschrieben und keiner ist mehr aus der Reihe gefallen, da alle mit 00,00 enden!Hast du mir noch nen Tip wie ich das dann noch mit dem DNS(primary,secondary) Key zusammenfügen machen kann? Dürfte ja ähnlich gehen?
-
Manuell mit strcpy() bzw. wcscpy() - du übergibst als Zielposition 'WriteValue+len**+1**' (das ist die Position hinter der Schluß/Trennmarke \0) und ermittelst die Gesamtlänge des Strings manuell als strlen(primary)+1/*Trenner*/+strlen(secondary)+2/*Abschluß*/.
-
guat probier ich aus, werd später die Lösung oder vielleicht noch ne Frage posten...
-
Also so ganz bekomme ich es nicht hin...
Wenn ich mit "wcscat(WriteValue, lpstrSubkeyValueDNSSecondary);" die zweite IP ranhängen möchte, dann wird damit "\0" überschrieben und ich hab zwei aneinander hängende IPs...WCHAR lpstrSubkeyValueDNSPrimary[MAX_PATH+1]; WCHAR lpstrSubkeyValueDNSSecondary[MAX_PATH+1]; int len=strlen(NetValueArray[queryCounter]); int len2=strlen(NetValueArray[queryCounter+1]); int lenAll; MultiByteToWideChar(CP_ACP, 0, NetValueArray[queryCounter], -1, lpstrSubkeyValueDNSPrimary, sizeof(lpstrSubkeyValue)); MultiByteToWideChar(CP_ACP, 0, NetValueArray[queryCounter+1], -1, lpstrSubkeyValueDNSSecondary, sizeof(lpstrSubkeyValue)); wcscpy(WriteValue, lpstrSubkeyValueDNSPrimary); [b]// hier vermisse ich später mein "\0"[/b] // muss hier "eigentlich" nicht hin da ja schon ein "\0" im String steht // --> WriteValue[len]=WriteValue[len+1]=L'\0'; <-- // wcscat(WriteValue, lpstrSubkeyValueDNSSecondary); WriteValue[len+1+len2]=WriteValue[len+1+len2+1]=L'\0'; lenAll = (len+1+len2+1); iSuccess = RegCreateKeyEx( HKEY_LOCAL_MACHINE, lpstrKey, 0L,NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey,lpdwDispHex); if(iSuccess == ERROR_SUCCESS) { RegSetValueEx(hKey, lpstrSubkey, 0, REG_MULTI_SZ, (LPBYTE)WriteValue, 2*(lenAll)); }
-
Ja, \0 ist immer noch das Stringende - und damit auch der Ansatzpunkt, wo strcat() ansetzt. Da du eine Stelle weiter hinten anfangen willst, kannst du es hier nicht verwenden:
wcscpy(WriteValue, lpstrSubkeyValueDNSPrimary); wcscpy(WriteValue+len+1, lpstrSubkeyValueDNSSecondary); ...
-
ahh so gibt man da die länge mit!
ich habs mit sowas probiert, und das geht nicht:
wcscpy(WriteValue[len+1], lpstrSubkeyValueDNSSecondary);Danke vielmals, sollte jetzt alles sein, was das schreiben von Registry Einträgen anbelangt...