2010-07-14 18 views
0

Je voudrais utiliser l'appel GetVolumeInformation pour récupérer le nom d'un périphérique amovible. Je peux récupérer le nom et stocker dans une variable de tableau TCHAR szVolNameBuff. Voici mon code pour que:Array stocke le nom récupéré de GetVolumeInformation étrangement dans Visual C++?

// 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)); 

Quand je tente d'imprimer le contenu de la variable avec la ligne:

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

je reçois une sortie de « T » au lieu du nom « Transcend » qui est le nom du lecteur. J'ai débogué avec Visual Studio 2008 et découvert que le tableau TCHAR stocke le nom comme: [0] 'T' [1] 0 [2] 'R' [3] 0 [4] 'A' [5] 0 [6] 'N' [7] 0

et ainsi de suite. Pourquoi donc? Je veux la matrice pour stocker le mot juste:

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

pour l'utiliser plus tard pour la concaténation de chaînes. Y'a t'il un moyen d'arranger cela?

Répondre

2

Il semble que vous utilisiez les API Win32 Unicode. Vous devriez utiliser _tprintf pour que la fonction appropriée (printf ou wprintf) soit utilisée en fonction du type de caractère.

Si vous ne connaissez pas unicode - voici un bref aperçu. La raison pour laquelle cela se produit est que l'unicode pour les caractères ASCII réguliers est un octet nul suivi du caractère ASCII. C'est pourquoi vous voyez la chaîne remplie de zéros.

Notez que lors de l'utilisation de TCHAR, vous devez également placer toutes les chaînes dans la macro _T(), afin qu'elles soient également déclarées du type correct. Si vous suivez cela régulièrement, la conversion d'unicode en ansi consiste simplement à changer une directive de préprocesseur.

+0

Vérifiez les paramètres du projet pour le jeu de caractères/caractères –

+0

Merci pour le conseil printf! Cependant, je veux toujours essayer de résoudre la situation de tableau afin que je puisse concaténer des chaînes plus tard. Lorsque j'essaie de concaténer des chaînes en utilisant lstrcat en ce moment, j'obtiens toujours l'erreur. Existe-t-il un moyen de concaténer des chaînes afin que je puisse obtenir une sortie de (par exemple) "Exemple-Transcend" plutôt que "Exemple-T"? – ffrstar777

+0

Vous pourriez avoir plus de chance en utilisant _tstrcat et toutes les fonctions _tXXX connexes.De cette façon, vous savez que vous utilisez le bon ensemble de fonctions et ne pas mélanger Unicode et ANSI. – mdma

0

Pourquoi utilisez-vous les versions Unicode des API Win32?

Et il y a 2 corrections. La première consiste à utiliser les versions standard de l'API qui, si vous utilisez Visual Studio, peut être effectuée en remplaçant le jeu de caractères de votre projet par "Non défini" dans Projets-> Propriétés-> Propriétés de configuration-> Général-> Jeu de caractères, ou en vérifiant que UNICODE n'est pas # défini avant d'inclure windows.h si vous n'utilisez pas VS.

La seconde correction, comme l'a dit mdma, consiste à utiliser la fonction de manipulation de texte Unicode wprintf ou à utiliser% S dans la bibliothèque standard. C'est le correctif préféré car votre programme deviendrait alors compatible avec l'internationalisation et fonctionnerait quel que soit le jeu de caractères utilisé par les noms de fichiers. Cependant, cela signifierait que toutes les fonctions en aval devraient également utiliser Unicode, ce qui pourrait signifier beaucoup de travail, en fonction de la taille du projet.