Массив хранит имя, полученное из GetVolumeInformation странным образом в Visual C ++? - PullRequest
0 голосов
/ 15 июля 2010

Я хотел бы использовать вызов GetVolumeInformation для получения имени съемного устройства. Я могу просто получить имя и сохранить его в переменной массива TCHAR szVolNameBuff. Вот мой код для этого:

 // 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));

Когда я пытаюсь распечатать содержимое переменной со строкой:

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

Я получаю вывод «T» вместо названия «Transcend», которое является названием накопителя. Я отладил его в Visual Studio 2008 и обнаружил, что массив TCHAR хранит имя как: [0] 'T' [1] 0 [2] 'R' [3] 0 [4] «А» [5] 0 [6] 'N' [7] 0

и так далее и тому подобное. Это почему? Я хочу, чтобы массив сохранял слово как просто:

[0] 'T' [1] 'R' [2] «А» [3] 'N' [4] 'S'

чтобы позже использовать его для конкатенации строк. Есть ли способ это исправить?

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Похоже, вы используете Unicode Win32 API.Вы должны использовать _tprintf, чтобы использовать соответствующую функцию (printf или wprintf) в соответствии с типом символа.

Если вы не знаете Unicode - вот краткий обзор.Причина, по которой это происходит, заключается в том, что юникод для обычных символов ascii является нулевым байтом, за которым следует символ ascii.Вот почему вы видите строку, дополненную нулями.

Обратите внимание, что при использовании TCHAR вы должны также обернуть все строки в макросе _T (), чтобы они также были объявлены правильного типа.Если вы будете следовать этому принципу последовательно, переход от unicode к ansi - это всего лишь вопрос изменения директивы препроцессора.

0 голосов
/ 15 июля 2010

Почему вы используете версии Win32 API для Unicode.

И есть 2 исправления.Во-первых, это использовать стандартные версии API, которые, если вы используете Visual Studio, можно сделать, изменив набор символов вашего проекта на «Не установлен» в «Проекты-> Свойства-> Свойства конфигурации-> Общие-> Набор символов», илиубедившись, что UNICODE не определен # перед включением windows.h, если вы не используете VS.

Второе исправление, как сказал mdma, заключается в использовании функции манипулирования текстом Unicode wprintf или использовании% S встандартная библиотека.Это предпочтительное исправление, так как ваша программа станет дружественной к интернационализации и будет работать с любым набором символов, который использовался в именах файлов.Однако это будет означать, что все функции нисходящего потока также должны будут использовать Unicode, что может потребовать много работы, в зависимости от размера проекта.

...