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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top