3 votes

Comment convertir const char* en const WCHAR* ?

J'ai quelque chose comme ça :

if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

Je reçois une erreur : cannot convert 'const char*' to 'const WCHAR*' for argument '1' to 'DWORD GetFileAttributesW(const WCHAR*)'

Comment convertir const char* à const WCHAR* ?

3voto

Remus Rusanu Points 159382

Ne pas utiliser GetFileAttributesW , utiliser GetFileAttributes . Ajouter _T à toutes les chaînes de caractères constantes, et utiliser _TCHAR* . Et INVALID_FILE_ATTRIBUES est définitivement no une chaîne...

if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES ) 
 {...}

Voir Résumé de la programmation Unicode .

1voto

PaperBirdMaster Points 2262

Vous mélangez des textes littéraux d'un type de codification avec des appels de fonction d'un autre type de codification.

Toute cette confusion est due à l'obscure chaîne des #define et typedef que Microsoft place dans ses en-têtes.

L'une des astuces ennuyeuses de Microsoft consiste à déclarer deux appels de fonction différenciés par une lettre. A o W en fonction des paramètres du projet. Il existe une macro qui transforme le GetFileAttributes à GetFileAttributesA o GetFileAttributesW si UNICODE est définie.

Dans votre cas, vous vous débarrassez de la macro et appelez la fonction UNICODE directement (celle qui se termine par la lettre W ), mais dans votre appel, vous utilisez un littéral qui n'a pas de longueur, vous pouvez le corriger facilement en ajoutant un L au littéral (comme suggéré par d'autres utilisateurs) :

if(GetFileAttributesW(L"C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

Ainsi, si vous appelez la version terminée par A vous pouvez utiliser un littéral sans restriction :

if(GetFileAttributesA("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

L'autre moyen de résoudre le problème est d'utiliser la fonction _T macro (Check cette réponse ) :

if(GetFileAttributesW(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}

Mais si UNICODE n'est pas défini, votre problème initial se posera à nouveau ; enfin, vous pouvez vous rendre à la façon de faire de Microsoft et utiliser toutes les macros fournies :

// Note the lack of W or A, it's a macro, not a function call!!
if(GetFileAttributes(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}

En utilisant les deux macros (celle qui modifie la valeur de la GetFileAttributes avec le UNICODE ou non UNICODE et celle qui ajoute le L au littéral), il n'est pas nécessaire de se préoccuper des paramètres du projet car les macros s'en chargent à votre place.

Editer.

C'est dommage, j'ai failli oublier la partie la plus importante.

Comme l'ont souligné d'autres utilisateurs, vous comparez la valeur de retour de GetFileAttributes avec un texte littéral ; il renvoie un DWORD et selon la documentation de Microsoft :

Un DWORD est un entier non signé de 32 bits (de 0 à 4294967295 en décimal).

En fin de compte, vous comparez un entier avec un char[24] La comparaison est possible, mais elle ne sera jamais vraie ! Il faut lire la fonction et savoir comment l'utiliser ;)

0voto

willsteel Points 2318

Vous essayez de comparer l'adresse des pointeurs plutôt que le contenu !

Fonction de contrôle : memcmp(...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X