Массивовые магазины Имя, извлеченные из GetVolumeInformation странно в Visual C ++?

StackOverflow https://stackoverflow.com/questions/3251079

Вопрос

Я хотел бы использовать вызов getVolumeInformation для извлечения имени съемного устройства.Я могу извлечь имя просто отлично и хранить в переменную Tchar Array 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 и обнаружил, что Acharay хранит имя как: [0] 'T' [1] 0 [2] 'R' [3] 0 [4] 'A' [5] 0 [6] 'n' [7] 0

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

[0] 'T' [1] 'R' [2] 'A' [3] 'n' [4] 'S'

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

Это было полезно?

Решение

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

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

Обратите внимание, что при использовании tchar вы также должны обернуть все строки в макросе _t (), чтобы они также объявили о правильном типе.Если вы будете последовательно последовать, преобразование от Unicode в ANSI - это просто вопрос смены препроцессорной директивы.

Другие советы

Почему вы используете версии Unicode of apis win32.

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

Второе исправление, как сказал MDMA, состоит в том, чтобы использовать функцию обработки текста Unicode WPRINTF или использовать% s в стандартной библиотеке.Это предпочтительное решение, поскольку ваша программа затем станет дружественной интернационализацией и работает любым набором символов, используемые имена файлов.Однако это будет означать, что все функции по потоковым потоком должны будут также использовать Unicode, что может означать много работы, в зависимости от размера проекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top