Domanda

Vorrei utilizzare la chiamata GetVolumeInformation per recuperare il nome di un dispositivo rimovibile.Posso recuperare il nome bene e immagazzinerò in una variabile di szvolnamebuff della matrice Tokar.Ecco il mio codice per questo:

 // 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 provo a stampare il contenuto della variabile con la riga:

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

Ottengo un'uscita di "T" invece del nome "Transcend" che è il nome dell'unità.L'ho debuggerito con Visual Studio 2008 e ho scoperto che il Tokar Array memorizza il nome come: [0] 'T' [1] 0 [2] 'r' [3] 0 [4] 'A' [5] 0 [6] 'n' [7] 0

E così via e così via.Perché?Voglio che l'array di memorizzare la parola come solo:

[0] 't' [1] 'r' [2] 'A' [3] 'n' [4] 'S'

A seguito lo usano per la concatenazione delle stringhe.C'è un modo per risolvere questo problema?

È stato utile?

Soluzione

Sembra che tu stia usando le API dell'UNICODE Win32.È necessario utilizzare _tprintf in modo che la funzione appropriata (PrintF o WPrintf) venga utilizzata in base al tipo di carattere.

Se non conosci Unicode - ecco una panoramica rapida.La ragione per cui questo sta accadendo è che l'Unicode per i normali personaggi ASCII è un byte nullo seguito dal personaggio ASCII.Ecco perché stai vedendo la corda imbottita con nulls.

Notare che quando si utilizza Tokar, è necessario avvolgere anche tutte le stringhe nella macro _T (), in modo che vengano anche dichiarate del tipo corretto.Se segui questo costantemente, convertire da Unicode a ANSI è solo una questione di modificare una direttiva preprocessore.

Altri suggerimenti

Il perché è che stai usando le versioni Unicode delle API di Win32.

E ci sono 2 correzioni.Il primo è utilizzare le versioni standard dell'API che se si utilizza Visual Studio può essere eseguita modificando il set di caratteri del progetto su "non impostato" nei progetti-> Proprietà-> Proprietà di configurazione-> General-> Set di caratteri oAssicurati che Unicode non sia #Definato prima di includere Windows.h se non stai usando VS.

La seconda correzione, come ha detto MDMA, è utilizzare la funzione di manipolazione del testo Unicode wprintf o utilizzare% s nella libreria standard.Questa è la correzione preferita come il tuo programma diventi quindi amichevole di internazionalizzazione e lavoro qualunque sia il carattere impostato i nomi dei file utilizzando.Tuttavia significherebbe che tutte le funzioni di flusso down dovrebbero usare anche unicode, il che potrebbe significare un sacco di lavoro, a seconda delle dimensioni del progetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top