Registryeintraege schreiben, fehlende hex zeichen



  • ok lpstrSubkeyValue ist wahrscheinlich vom typ wchar_t. Da musst du dann wcscat statt strcat anwenden. achte auch darauf das du genug speicher reserviert hast.



  • Weißt du, wie strlen() arbeitet? Das zählt einfach die Zeichen, bis es auf das erste \0 Byte trifft. Da allerdings die Nullen bei dir zu den Daten gehören, schneidest du dir damit selber den Rest der Daten ab.

    Lösung: Du kannst die "Länge" des einzutragenden Registry-Strings nicht mit strlen() ermitteln, sondern mußt dir selber merken, wie lang er ist.



  • moin

    Danke das mit wcscat bringt es nahezu. Also bei einer langen IP, 123.123.123.123, ist der RegKey immer richtig. Wenn die Ip jedoch von der länge gegen 1.1.1.1 geht dann steht meistens nicht "00,00" sondern "00,undnochetwasanderes"!? Kann auch schon bei 12.12.12.1 passieren.

    WCHAR ZeroValue[MAX_PATH+1];
    WCHAR WriteValue[MAX_PATH+1];
    WCHAR lpstrSubkeyValue[MAX_PATH+1];
    //  IP adresse setzen
    lpstrSubkey = L"IpAddress";
    MultiByteToWideChar(CP_ACP, 0, NetValueArray[queryCounter], -1, lpstrSubkeyValue, sizeof(lpstrSubkeyValue));
    MultiByteToWideChar(CP_ACP, 0, "\0", -1, ZeroValue, sizeof(ZeroValue));
    
    DWORD dwDispHex = 0;
    LPDWORD lpdwDispHex = &dwDispHex;
    
    iSuccess = RegCreateKeyExW( HKEY_LOCAL_MACHINE, lpstrKey, 0L,NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey,lpdwDispHex);
    if(iSuccess == ERROR_SUCCESS)
    {
       wcscpy(WriteValue, lpstrSubkeyValue);
       wcscat(WriteValue, ZeroValue);
       RegSetValueEx(hKey, lpstrSubkey, 0, REG_MULTI_SZ, (LPBYTE)WriteValue, (strlen(NetValueArray[queryCounter])*2)+3);
    }
    

    Ich denke mal das liegt irgendwie an meinen Längenangaben...
    Bei RegSetValueEx übergeb ich ja die Länge des eigenlichen Ip-Strings vor der ganzen Umwandlung, und dann noch +3 dazu, 1 fürs erste "\0" und 2 fürs zweite "\0". Wenn ich nämlich ein +2 hinzufüge dann bekomme ich immer gute Werte aber nur mit einem "00", deshalb +3!
    Seh ich das soweit richtig?



  • 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,00
    

    Ein 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,00
    

    Wenn ich jetzt nur meinen Wert nehme und schreibe habe ich nur:

    "IP"=hex(7):\
          31,2e,31,2e,31,2e,31,00
    

    Die 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,00
    

    Getrennt 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...


Anmelden zum Antworten