Konvertieren zu AnsiString usw
-
Hallo
Die Methode ReadString ist natürlich nur für Registrywerte mit dem Typ "Zeichenfolge". Wenn du damit einen Wert vom Typ "Binär" oder "DWord" auslesen willst, must du entsprechend andere Methoden vpn TRegistry benutzen.
bis bald
akari
-
Danke aber was nimmt man denn für eine mehrteilige Zeichenfolge??
-
Hallo
Zumindstens bei meinem BCB5 ist noch keine extra Methode für die Behandlung dieses Types vorhanden. Wenn also die gewöhnliche ReadString-Methode das nicht macht, und auch sonst keine vorhanden ist, must du also doch die WinAPI-Funktion verwenden.
Allerdings wäre dann auch dort zu beachten, das der Typ nicht wie bei dir einfach '0' ist, sondern REG_MULTI_SZ.
Desweiteren müßen dann die zu übergebenen Daten in einem speziellen Null-Terminierten Format stehen, wie im Link beschrieben.Das sollte also ungefähr so aussehen
AnsiString Text1 = "text1"; AnsiString Text2 = "text2"; int size = text1.Length() + text2.Length() +2 +1; // Gesamtgröße des zu übergebenen Strings : Alle Strings an sich, für jeden ein extra 0 und ein abschließendes 0 char* buffer = new char[size]; // Speicher reservieren strncpy(buffer, Text1.c_str(), Text1.Length()); // Ersten String in Speicher kopieren buffer[Text1.Length()] = '\0'; // Ersten String abschließen char* next = buffer += Text1.Length(); // Zeiger auf den Platz für zweiten String im Speicher bestimmen strncpy(next, Text2.c_str(), Text2.Length()); // Zweiten String kopieren next[Text2.Length()] = '\0'; // Zweiten String abschleißen next[Text2.Length() +1] = '\0'; // Gesamtdaten abschließen RegQueryValueEx(hKey,"EintragsName",0,REG_MULTI_SZ,buffer,size); ... delete[] buffer;Achtung ungetestet und unschön
bis bald
akari
-
Wie lautete denn diese Methode bei BCB 5??
-
Hallo
Wie bereits gesagt : TRegistry des BCB5 unterstützt kein MultiString. Da müßen die entsprechenden WinAPI-Funktionen benutzt werden (TRegistry arbeitet intern natürlich auch nur mit den WinAPI-Funktionen)
Ob es bei neueren Buildern bereits eine Unterstützung gibt, weiß ich nicht, ist aber wahrscheinlich.
bis bald
akari
-
Danke, danke für die ganzen Infos, doch wie kann ich denn mit diesem WinAPI-Zeugs die Sache auslesen??
Also schreiben ist mitlerweile np aber halt das Lesen....
Und wie kann ich HEX- Werte lesen bzw schreiben?
DAs müsste doch sicherlich über Binärzahlen oder so gehen, oder??
-
Hallo
wie kann ich denn mit diesem WinAPI-Zeugs die Sache auslesen?
Genau andersum mit der WinAPI-Funktion RegQueryValueEx
Du must dafür aber erstmal mit RegGetValue die Größe des zu erwartetenden String-Konstruktes bestimmen. Mit der erhaltenen Größe in Bytes must du dann wie oben ein char-Feld erstellen und dieses als Argument an RegQueryValueEx übergeben.
Waren beide Funktionsaufrufe erfolgreich (Bei WinAPI-Funktionen immer mit dem Rückgabewert prüfen!), must du noch das erhaltenen String-Konstrukt auseinandernehmen und in AnsiString umwandeln. Das Format ist das gleiche wie beim Schreiben.
Hier sind dringend Kenntnisse in manueller Speicherverwaltung und C-String-Bearbeitung notwendig.Und wie kann ich HEX- Werte lesen bzw schreiben?
Den Computer interessiert nicht ob Hex oder Dezimal, für ihn ist alles binär. Hast du eine Zahl die in ein Integer passt und als Wertetyp DWord, nimmst du TRegistry::ReadInteger bzw die bereits bekannten WinAPI-Funktionen mit passenden Argumenten.
Passt der Wert nicht mehr in einen Integer, must du gleich mit dem Wertetyp Binär und TRegistry::ReadBinaryData bzw. analogen WinAPI-Argumenten arbeiten.bis bald
akari
-
Also wegen der Hex-Zahl, ich möchte in ein Edit-Feld einen Hex-Wert eingeben, mit 8xf, also auf jeden Fall zu groß für ein Int, doch wie genau soll ich das dann mit Bin machen?
Uff das mit dem c-Strings ist schon Jahre her, könntest du nicht vlt was hinzaubern um halt diesen String auszulesen und letzten endes in ein Edit-Feld einfügen zu können...
-
akari bitte helf mir doch!

-
Hallo
Also wegen der Hex-Zahl, ich möchte in ein Edit-Feld einen Hex-Wert eingeben, mit 8xf, also auf jeden Fall zu groß für ein Int
Nein, 0xFFFF FFFF ist genau die obere Grenze für ein unsigned int auf 32 Bit Plattformen. Wenn das also der maximal Wert ist, reicht ein int genau aus.
Uff das mit dem c-Strings ist schon Jahre her, könntest du nicht vlt was hinzaubern um halt diesen String auszulesen und letzten endes in ein Edit-Feld einfügen zu können...
Hab grad keine Zeit und kein XP hier, um das auszuarbeiten. Also setzt dich mal dran, das Prinzip hab ich ja schon beschrieben.
bis bald
akari
-
Danke, das mitn Hex habe ich inzwischen hinbekommen, das mit dem Anderen muss ich noch die Tage mal gucken!

-
Hi, ich habe es jetzt testweise so angetestet:
AnsiString GetRegistryValueMulti(AnsiString KeyName,AnsiString Value) { HKEY hKey; AnsiString S; DWORD dwData = 256; RegCreateKeyEx(HKEY_LOCAL_MACHINE,KeyName.c_str(),0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0); char cDaten[256] = ""; RegQueryValueEx(hKey,Value.c_str(),0,REG_MULTI_SZ,cDaten,&dwData); S=cDaten; RegCloseKey(hKey); return S; }Soweit so gut, doch das REG_MULTI_SZ ist wohl dort fehl am Platze!
Da meint er nur:
[C++ Error] Unit1.h(63): E2034 Cannot convert 'int' to 'unsigned long *'
[C++ Error] Unit1.h(63): E2342 Type mismatch in parameter 'lpType' (wanted 'unsigned long *', got 'int')
-
Bitte helft mir doch mal weiter!
-
Hallo
Du hast deine Funktion Get...Multi genannt, hast aber als Rückgabewert nur einen einzelnen AnsiString? Mit scheint du hast noch immer nicht verstanden das du potentiell mehr als einen AnsiString verarbeiten must.
AnsiString GetRegistryValueMulti(AnsiString KeyName,AnsiString Value)bis bald
akari