2009-05-17 10 views
2

Ceci est ma procédure:C++ std :: problème de conversion de chaîne sous Windows

bool Open(std::string filename) 
{ 
    ... 
    HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 
    ... 
} 

Erreur: 'CreateFileW': ne peut pas convertir le paramètre 1 de 'const char *' à 'LPCWSTR' Types pointé ne sont pas liés ; la conversion nécessite reinterpret_cast, cast de style C ou cast de fonction

Où est le problème?

Répondre

13

Une chaîne std :: string est constituée d'un tableau de caractères, et ainsi la fonction c_str renvoie const char*. Un LPCWSTR est un pointeur long vers une chaîne large constante, ou en d'autres termes, const wchar_t*.

Vous avez donc quelques options. Soit obtenir le nom du fichier en tant que chaîne large (std :: wstring), ou spécifier que vous voulez plutôt la version non-large de CreateFile. Cela peut être fait en appelant CreateFileA ou en désactivant UNICODE dans les paramètres de votre projet. CreateFile est une macro qui se résout à CreateFileA (la version char) ou CreateFileW (la version char large) selon si unicode est activé ou non.

+3

Note: La bonne solution, surtout s'il s'agit d'un nouveau logiciel, est d'utiliser std :: wstring. –

1

Il semble que vous compiliez avec le support Unicode activé. Vous pouvez le désactiver, ou sinon utilisez std :: wstring au lieu de std :: string.

Comme d'autres l'ont suggéré, vous pouvez appeler CreateFileA directement, mais je vous suggère fortement de ne pas le faire - vous vous retrouverez avec une collection non modifiable d'appels de fonctions Unicode et non-Unicode.

+0

Comment désactiver le support Unicode? –

+0

Dépend de votre plateforme de développement. –

2

Vous avez spécifié std :: string, dont le type de caractère est char. Et le code que vous utilisez CreateFile() doit être compilé sous la définition du symbole de pré-processeur UNICODE, puisque cela sélectionne la fonction sous-jacente réelle CreateFileW(). Vous pouvez supprimer la définition UNICODE ou utiliser explicitement CreateFileA().

0

Le problème est que vous essayez de passer char * à une fonction nécessitant wchar_t *

Vous pouvez écrire une fonction pour convertir chaîne en wstring:

wstring Widen(const string& str); 

Ensuite, vous pouvez appeler CreateFile comme ceci:

HANDLE hFile = CreateFile(Widen(filename).c_str(), etc.); 

Une autre technique que je l'ai vu utilisé est de définir certaines conditions TString être soit chaîne ou wstring en fonction du réglage Unicode, et utiliser TString partout dans votre code.

bool Open(tstring filename) 
{ 
    ... 
    HANDLE hFile = CreateFile(filename.c_str(), etc.); 
    ... 
} 

Je suis un peu épineux et la meilleure solution pour vous est quelque chose que vous pouvez décider. Cependant, je serais d'accord avec Neil et éviter d'appeler directement CreateFileA, car cela vous laissera dans le pétrin.