Matriz armazena o nome obtidos a partir GetVolumeInformation estranhamente no Visual C++?
-
15-09-2020 - |
Pergunta
Eu gostaria de usar o GetVolumeInformation chamada para recuperar o nome de um dispositivo removível.Eu posso recuperar o nome de apenas multa e armazenar em uma TCHAR variável de matriz szVolNameBuff.Aqui é o meu código para que:
// 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));
Quando tento imprimir o conteúdo de uma variável com a linha:
printf("szVolNameBuff holds: %s \n", &szVolNameBuff);
Eu recebo uma saída de "T" em vez do nome de "Transcender", que é o nome da unidade.Eu depurado-lo com o Visual Studio 2008 e constatou que o TCHAR matriz armazena o nome como:[0] 'T' [1] 0 [2] 'R' [3] 0 [4] 'A' [5] 0 [6] 'N' [7] 0
e assim por diante e assim por diante.Por que isso?Eu quero que a matriz para armazenar a palavra apenas como:
[0] 'T' [1], "R" [2] 'A' [3] 'N' [4] 'S'
para depois usá-lo para concatenação de seqüência de caracteres.Existe uma maneira de corrigir isso?
Solução
Parece que você está usando unicode APIs do Win32.Você deve usar _tprintf de modo que a função adequada (printf ou wprintf) é usado de acordo com o tipo de caractere.
Se você não sabe unicode - aqui está uma rápida visão geral.A razão que isto está acontecendo, é que o unicode para o regular caracteres ascii é um byte nulo seguido por caracteres ascii.É por isso que você está vendo a seqüência de caracteres preenchidos com valores nulos.
Observe que, ao usar TCHAR, você deve também envolver todas as cadeias no _T() macro, de modo que eles também são declaradas do tipo correto.Se você seguir isso de forma consistente, a conversão de unicode para ansi é apenas uma questão de alterar uma diretiva de pré-processador.
Outras dicas
Por que é que você está usando as versões Unicode as APIs do Win32.
E há 2 correções.A primeira é usar o versões padrão do API que se você estiver usando o Visual Studio pode ser feito alterando seu projeto de Conjunto de Caracteres para 'Não definido' em Projetos-> Propriedades-> Propriedades de Configuração-> Geral-> Conjunto de Caracteres, ou certificando-se de UNICODE não é #definido antes, incluindo o windows.h se você não estiver usando o VS.
A segunda correção, como mdma, disse, é para usar o texto em Unicode função de manipulação de wprintf ou use o %S na biblioteca padrão.Esta é a melhor correção como o seu programa, então, tornam-internacionalização amigável e de trabalho, qualquer que seja o conjunto de caracteres de nomes de arquivo em uso.No entanto, isso significaria que todas as funções de fluxo de precisaria usar Unicode, o que pode significar um monte de trabalho, dependendo do tamanho do projeto.