Negozi di array Nome recuperata da GetVolumeInformation stranly in Visual C ++?
-
15-09-2020 - |
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?
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.