Question

J'aimerais utiliser l'appel GetVolumeInformation pour extraire le nom d'un périphérique amovible.Je peux récupérer le nom juste bien et stocker dans une variable de tableau de TCHAR Szvolnamebuff.Voici mon code pour cela:

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

Lorsque j'essaie 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.Je l'ai débogué avec Visual Studio 2008 et j'ai découvert que le tableau TCHAR stocke le nom comme: [0] 'T' [dix [2] 'r' [3] 0 [4] 'A' [5] 0 [6] 'n' [7] 0

et ainsi de suite et ainsi de suite.Pourquoi donc?Je veux que la matrice stocke le mot comme juste:

[0] 'T' [1] 'r' [2] 'a' [3] 'n' [4] 's'

Pour l'utiliser ultérieurement pour la concaténation de la chaîne.Y a-t-il un moyen de résoudre ce problème?

Était-ce utile?

La solution

On dirait que vous utilisez les API UNICODE WIN32.Vous devez utiliser _TPRINTF afin que la fonction appropriée (PrintF ou WPRITF) soit utilisée en fonction du type de caractère.

Si vous ne connaissez pas Unicode - voici un aperçu rapide.La raison pour laquelle cela se passe est que l'Unicode pour les caractères ASCII réguliers est un octet NULL suivi du caractère ASCII.C'est pourquoi vous voyez la chaîne rembourrée avec des NULLS.

Notez que lors de l'utilisation de TCHAR, vous devez également envelopper toutes les chaînes de la macro _t () afin qu'elles soient également déclarées du type correct.Si vous le suivez systématiquement, la conversion de Unicode en ANSI n'est qu'une question de modification d'une directive de préprocesseur.

Autres conseils

Le pourquoi est-ce que vous utilisez les versions Unicode des API Win32.

Et il y a 2 correctifs.Le premier consiste à utiliser les versions standard de l'API que si vous utilisez Visual Studio peut être effectuée en modifiant le jeu de caractères de votre projet sur "Non défini" dans Projets-> Propriétés-> Propriétés de configuration-> Général-> Ensemble de caractères, ouEn veillant à ce que Unicode n'est pas #define avant y compris Windows.h si vous n'utilisez pas VS.

Le deuxième correctif, comme l'a dit MDMA, consiste à utiliser la fonction de manipulation du texte UNICODE WPRINTF ou utilisez% s dans la bibliothèque standard.Ceci est le correctif préféré car votre programme deviendrait alors l'internationalisation amicale et travaille tout autre que le caractère définit les noms de fichiers utilisaient.Cependant, cela signifierait que toutes les fonctions de flux devraient également utiliser Unicode, ce qui pourrait signifier beaucoup de travail, en fonction de la taille du projet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top