Konvertieren zu AnsiString usw
-
Hallo,
ich möchte ein Programm schreiben, mit dem man Registryschlüssel auslesen und verändern kann.
Mit Folgendem Code kann man ein Wert erstellen:
BYTE cString[]="Hallo, das ist der eigentliche Wert, der unter dem Namen EintragsName gespeicehrt wird"; RegSetValueEx(hKey,"EintragsName",0,REG_SZ,cString,strlen(cString)+1);Wie kann ich in den cString ein AnsiString einfügen?
Also ich möchte aus einem Edit-Feld ein Wert in den cString einfügen, doch wie mache ich das?Anschließend lese ich mit folgendem Code einen Schlüssel aus:
DWORD dwData = 256; BYTE cDaten[256] = ""; RegQueryValueEx(hKey,"EintragsName",0,0,cDaten,&dwData);Wie kann ich den Wert von cDaten in ein Label schreiben, sprich cDaten zu AnsiString konvertieren??
Den Code habe ich von:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39373.htmlMFG TheCaleb
-
Zunächst: AnsiString ist eine Borland-Klasse, hat also nichts im ANSI-C++ Board zu tun (trotz des "Ansi" im Namen ;)).
Zu deiner eigentlichen Frage: Jede vernünftige String-Klasse, die ich kenne, hat eine Konvertierungs von und nach 'const char*' (entweder implizit oder eine Methode ala c_str()). Also schau mal in der BCB-Doku nach, wie die entsprechenden Methoden für AnsiString heißen.
-
Hallo
Die WinAPI-Funktionen arbeiten nur C-Typen, du must also von dem C-Array in AnsiString umwandeln. Von AnsiString nach C-Array mit der C-Funktion strncpy, von C-Array nach AnsiString einfach zuweisen.
Da du offenbar den Borland Builder, kannst du aber gleich mit der Klasse TRegistry arbeiten, die hat gleich AnsiString-Unterstützung. Das nötige dazu findest du in der Builder-Hilfe.
/Edit : Die Funktion heißt auch bei AnsiString c_str() und wird für strncpy gebraucht.
bis bald
akari
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Danke für die schnellen Anworten, doch wie genau sollte das im Code aussehen?
Könnt ihr mir mal bitte Beispiele gegeben?
Wäre voll nett, denn die Sache mit c_str und der einfachen Zuweisung habe ich schon bereits versucht und komme nicht weiter...
-
Hallo
Vergiß am besten die Sache mit dem C-Array, das ist nur fehleranfällig und "old-style".
Gib im Borland Code Editor "TRegistry" ein, drück F1, klick im Menü des Hilfefensters "Methoden" an, wähl in der neuen Liste "ReadString" aus, und klick im Menü wieder auf "Beispiel".bis bald
akari
-
Danke, ich werde es damit mal versuchen!
-
Hallo, ich habe nun diesen Code ein wenig verändert:
AnsiString GetRegistryValue(AnsiString KeyName,AnsiString Value) { AnsiString S; TRegistry *Registry = new TRegistry; try { Registry->RootKey = HKEY_LOCAL_MACHINE; Registry->OpenKey(KeyName, false); S = Registry->ReadString(Value); } __finally { delete Registry; } return S; }Ich schreibe in KeyName den Pfad zum Schlüssel rein
z.B. System\\CurrentControlSet...In Value schreibe ich den Namen des auszulesenden Schlüssels rein, liege ich mit den Sachen so richtig oder mache ich da nen Fehler, denn sobald ich das Programm laufen lasse, kommt eine Fehlermeldung: Invalid type for...
-
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!