2012-04-14 6 views
5

Questa è una domanda che riguarda principalmente WinAPI RegSetValueEx. Se si guarda la sua descrizione in MSDN here si trova:È necessario evitare le barre nelle stringhe nel registro di Windows?

lpDati [in] I dati da memorizzare.

REG_SZ, la stringa deve essere terminata con null. Con il tipo REG_MULTI_SZ , la stringa deve essere terminata con due caratteri null. Una barra rovesciata deve essere preceduta da un'altra barra rovesciata come carattere di escape . Ad esempio, specificare "C: \\ mydir \\ myfile" per memorizzare la stringa "C: \ mydir \ myfile".

La domanda che ho, ho davvero bisogno di sfuggire alle barre? Perché non l'ho mai fatto prima e ha funzionato perfettamente.

+0

L'escape è per C++, non per il metodo. Quindi, per esempio, se dovessi togliere l'input dell'utente dalla riga di comando, non avresti bisogno di trasformare il testo per avere \\ per tutti i \. Se, comunque, avessi intenzione di usare una stringa letterale nel codice, come "C: \ ..." avresti bisogno del tuo C++ di avere "C: \\ ...". Suppongo che questo sia ciò di cui parlano i dottori. C'è una possibilità che la pagina significhi che in realtà dovresti fare "C: \\\\ ..." (nel qual caso potresti dover trasformare l'input dell'utente) – Corbin

+0

@Corbin :) Beh, questo fa una grande differenza. È molto confuso come lo abbiano inserito nella documentazione. – ahmd0

+0

+1 buona domanda, questa documentazione è davvero bizzarra –

risposta

8

Si tratta di un errore di documentazione. Non hai bisogno di scappare dai backslash qui. La stringa esatta che invii a questa API è ciò che verrà memorizzato nel registro. Non verrà eseguita alcuna elaborazione di backslash.

Ora, è vero che in C e C++ è necessario sfuggire a determinati caratteri in stringhe letterali, ma ciò non è pertinente per una documentazione API Win32. Questo è un problema per il codice sorgente per la traduzione di codice oggetto per lingue specifiche e al di là del mandato di questa documentazione.

+0

Infatti. La parte chiave è l'escaping di caratteri di backslash in * string letterali *. –

2

Sì, perché \ ha un significato in C++, mentre \\ significa un normale backslash.

Quando \ appare in una stringa, compilatore C++ esaminerà il prossimo carattere e convertire la combinazione in qualcosa (per esempio \n sarà convertito in un carattere "a capo"). \\ verrà convertito in una normale barra rovesciata. Questo è chiamato "escaping" (storicamente, su vecchi terminali, la combinazione di tasti ESC + era usata per molti tasti che non erano sulla tastiera).

+0

Questo non è C++. Sto parlando del valore che viene passato all'API RegSetValueEx. – ahmd0

+0

@ ahmd0 Hai taggato la tua domanda con C++. Che lingua stai usando allora? – littleadv

+2

Sì, C++. E, naturalmente, so che è necessario sfuggire alle cose con una barra in C. La inseriscono in una descrizione per un'API di Windows anche se non ha alcuna relazione con C++ o con qualsiasi altra lingua. Ancora una volta, voglio sapere se MS vuole che usiamo le stringhe che vengono passate alle API del registro. – ahmd0

Problemi correlati