2012-04-14 5 views
5

Dies ist eine Frage, die hauptsächlich WinAPI RegSetValueEx betrifft. Wenn Sie sich die Beschreibung in MSDN here ansehen, finden Sie:Ist es notwendig, Schrägstriche in Strings in der Windows-Registrierung zu entkommen?

lpData [in] Die zu speichernden Daten.

REG_SZ, die Zeichenfolge muss nullterminiert sein. Bei dem Typ REG_MULTI_SZ data muss die Zeichenfolge mit zwei Nullzeichen abgeschlossen werden. Dem Backslash muss ein weiterer Backslash als Escapezeichen vorangestellt werden. Geben Sie beispielsweise "C: \\ mydir \\ myfile" an, um die Zeichenfolge "C: \ mydir \ myfile" zu speichern.

Die Frage, die ich habe, muss ich wirklich Schlitzen entkommen? Weil ich das vorher noch nie gemacht habe und es hat ganz gut funktioniert.

+0

Das Entweichen ist für C++, nicht für die Methode. Wenn Sie also beispielsweise Benutzereingaben von der Befehlszeile wegnehmen würden, müssten Sie den Text nicht in \\ für alle \ transformieren. Wenn Sie jedoch ein Zeichenfolgenliteral wie "C: \ ..." im Code verwenden möchten, benötigen Sie für Ihre C++ - Quelle "C: \\ ...". Ich gehe davon aus, dass die Docs davon sprechen. Es besteht die Möglichkeit, dass die Seite bedeutet, dass Sie tatsächlich "C: \\\\ ..." benötigen (in diesem Fall müssten Sie die Benutzereingabe umwandeln). – Corbin

+0

@Corbin :) Nun, das macht einen großen Unterschied. Es ist sehr verwirrend, wie sie es in die Dokumentation schreiben. – ahmd0

+0

+1 gute Frage, diese Dokumentation ist wirklich bizarr –

Antwort

8

Dies ist in der Tat ein Dokumentationsfehler. Sie müssen hier nicht Backslashes entkommen. Die genaue Zeichenfolge, die Sie an diese API senden, wird in der Registrierung gespeichert. Es wird keine Verarbeitung von Backslashes durchgeführt.

Nun ist es wahr, dass Sie in C und C++ bestimmte Zeichen in String-Literalen entkommen müssen, aber das ist nicht relevant für eine Win32-API-Dokumentation. Das ist ein Problem für den Quellcode, um Objektcode für bestimmte Sprachen zu übersetzen, und ist weit über den Rahmen dieser Dokumentation hinaus.

+0

In der Tat. Der Schlüsselteil besteht darin, Backslash-Zeichen in * String-Literalen * zurückzugeben. –

2

Ja, weil \ eine Bedeutung in C++ hat, während \\ einen gewöhnlichen Backslash bedeutet.

Wenn \ in einer Zeichenfolge angezeigt wird, wird C++ - Compiler auf das nächste Zeichen schauen und die Kombination in etwas konvertieren (zum Beispiel wird \n in ein "Newline" -Zeichen umgewandelt). \\ wird in einen regulären Backslash konvertiert. Dies wird "Entkommen" genannt (in der Vergangenheit wurde bei alten Terminals die Tastenkombination ESC + für viele Tasten verwendet, die nicht auf der Tastatur waren).

+0

Dies ist nicht C++. Ich spreche über den Wert, der an RegSetValueEx API übergeben wird. – ahmd0

+0

@ ahmd0 Sie haben Ihre Frage mit C++ markiert. Welche Sprache verwendest du dann? – littleadv

+2

Ja, C++. Und natürlich weiß ich, dass man Dinge mit einem Schrägstrich in C entschlüsseln muss. Sie stellen es in eine Beschreibung für eine Windows-API ein, die jedoch keine Beziehung zu C++ oder einer anderen Sprache hat. Auch hier möchte ich wissen, ob MS möchte, dass wir Zeichenfolgen entgehen, die an Registrierungs-APIs übergeben werden. – ahmd0