Pregunta

Me gustaría usar la llamada GetVolumeInformation para recuperar el nombre de un dispositivo extraíble.Puedo recuperar el nombre simplemente bien y almacenar en una variable de szvolnamebuff.Aquí está mi código para eso:

 // Get Volume Information to check for NTFS or FAT

  TCHAR szFileSys[256];
  TCHAR szVolNameBuff[256];
  DWORD dwSerial = 0;
  DWORD dwMFL = 0;
  DWORD dwSysFlags = 0;
  bool bSuccess;
  char fileType[255];
  int bSuccessdebug = 0;
  //LPCTSTR temp = _T("E:\\"); For debugging only

  bSuccess = GetVolumeInformation(drivePath, 
                                szVolNameBuff,
                                sizeof(szVolNameBuff),
                                &dwSerial, 
                                &dwMFL, 
                                &dwSysFlags,
                                szFileSys,
                                sizeof(szFileSys));

Cuando intento imprimir los contenidos de la variable con la línea:

printf("szVolNameBuff holds: %s \n", &szVolNameBuff);

Recibo una salida de "T" en lugar del nombre "Trascendido", que es el nombre de la unidad.Lo deprimí con Visual Studio 2008 y descubrí que la matriz TCHARE almacena el nombre como: [0] 't' [1] 0 [2] 'r' [3] 0 [4] 'a' [5] 0 [6] 'n' [7] 0

y así sucesivamente.¿Porqué es eso?Quiero que la matriz almacene la palabra como solo:

[0] 't' [1] 'r' [2] 'a' [3] 'n' [4] 's'

Para luego usarlo para una concatenación de cadena.¿Hay alguna manera de arreglar esto?

¿Fue útil?

Solución

Parece que estás usando las API de Unicode Win32.Debe usar _tprintf para que la función apropiada (Printf o WPRintf) se use de acuerdo con el tipo de carácter.

Si no conoce Unicode, aquí hay una visión general rápida.La razón por la que esto está sucediendo es que el Unicode para los caracteres ASCII regulares es un byte nulo seguido del carácter ASCII.Es por eso que está viendo la cuerda acolchada con nulos.

Tenga en cuenta que cuando se usa TCHAR, también debe envolver todas las cuerdas en la macro _T (), para que también sean declarados del tipo correcto.Si sigue esto constantemente, la conversión de Unicode a ANSI es solo una cuestión de cambiar una directiva de preprocesador.

Otros consejos

Por qué está usando las versiones de Unicode de las API de Win32.

y hay 2 arreglos.La primera es usar las versiones estándar de la API que, si está utilizando Visual Studio, se puede realizar cambiando el conjunto de caracteres de su proyecto en "No se establece" en proyectos-> Propiedades-> Propiedades de configuración-> General-> Conjunto de caracteres, oAl asegurarse de que Unicode no esté #definido antes de incluir Windows.H Si no está usando VS.

La segunda solución, como dijo MDMA, es usar la función de manipulación de texto Unicode WPRINTF o usar% S en la biblioteca estándar.Esta es la solución preferida, ya que su programa se convertiría en una internacionalización amigable y trabajará en cualquier conjunto de caracteres que estuvieran usando los nombres de los archivos.Sin embargo, significaría que todas las funciones de la corriente de abajo deberían usar unicode también, lo que podría significar mucho trabajo, dependiendo del tamaño del proyecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top