2012-04-14 16 views
5

Esta es una pregunta principalmente relacionada con WinAPI RegSetValueEx. Si nos fijamos en su descripción en MSDN here, encontrará:¿Es necesario escabullirse en cadenas en el Registro de Windows?

lpData [in] Los datos que se almacenarán.

REG_SZ, la cadena debe estar terminada en nulo. Con el tipo de datos REG_MULTI_SZ , la cadena debe terminarse con dos caracteres nulos. Una barra invertida debe estar precedida por otra barra invertida como carácter de escape . Por ejemplo, especifique "C: \\ mydir \\ myfile" para almacenar la cadena "C: \ mydir \ myfile".

La pregunta que tengo, ¿realmente necesito escapar de las barras? Porque nunca he hecho eso antes y funcionó perfectamente bien.

+0

El escape es para C++, no para el método. Entonces, por ejemplo, si fuera a quitar la entrada del usuario de la línea de comando, no necesitaría transformar el texto para tener \\ para todos los \. Sin embargo, si fuera a usar un literal de cadena en el código, como "C: \ ...", necesitaría que su fuente C++ tenga "C: \\ ...". Supongo que esto es de lo que están hablando los documentos. Existe la posibilidad de que la página signifique que realmente tendría que hacer "C: \\\\ ..." (en cuyo caso podría tener que transformar la entrada del usuario) – Corbin

+0

@ Corbin :) Bueno, eso hace una gran diferencia. Es muy confuso cómo lo ponen en la documentación. – ahmd0

+0

+1 buena pregunta, esta documentación es realmente extraña –

Respuesta

8

Esto es de hecho un error de documentación. No necesitas escapar de las barras diagonales aquí. La cadena exacta que envía a esta API es lo que se almacenará en el registro. No se realizará procesamiento de las barras invertidas.

Ahora, es cierto que en C y C++ debe escapar de ciertos caracteres en literales de cadena, pero eso no es pertinente para una documentación de la API de Win32. Ese es un problema para el código fuente para la traducción de código de objeto para idiomas específicos y bastante más allá del alcance de esta documentación.

+0

De hecho. La parte clave es escapar de los caracteres de barra invertida en * literales de cadena *. –

2

Sí, porque \ tiene un significado en C++, mientras que \\ significa una barra invertida normal.

Cuando \ aparece en una cadena, el compilador C++ observará el siguiente carácter y convertirá la combinación en algo (por ejemplo, \n se convertirá en un carácter de "nueva línea"). \\ se convertirá en una barra diagonal inversa regular. Esto se denomina "escape" (históricamente, en terminales antiguos, la combinación de teclas ESC + se usaba para muchas teclas que no estaban en el teclado).

+0

Esto no es C++. Estoy hablando del valor que se pasa a la API RegSetValueEx. – ahmd0

+0

@ ahmd0 Has etiquetado tu pregunta con C++. ¿Qué idioma estás usando entonces? – littleadv

+2

Sí, C++. Y, por supuesto, sé que uno necesita escapar de las cosas con una barra inclinada en C. Sin embargo, lo ponen en una descripción para una API de Windows que no tiene relación con C++ ni con ningún otro idioma. De nuevo, quiero saber si MS quiere que evitemos las cadenas que se pasan a las API de registro. – ahmd0

Cuestiones relacionadas