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