Quel est le type d’entrée attendu de FindFirstFile?

Je vais commencer par dire que je ne connais fondamentalement rien aux chaînes larges et au support Unicode. Je laisse QSsortingng et QFile gérer cela pour moi 99% du temps, mais j’essaie de comstackr la bibliothèque de quelqu’un d’autre écrite pour VC6.

Lorsque je comstack avec MSVC2010 dans Qt Creator, j’obtiens cette erreur:

error: C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

Le code utilise la fonction FindFirstFile , qui est surchargée (en quelque sorte) selon que vous comstackz avec le jeu de caractères Unicode. Je ne comprends pas le type FindFirstFile , alors que les entrées pour FindFirstFileA et FindFirstFileW semblent être deux types complètement différents.

Alors voici ma question: Quel est le type d’entrée attendu pour FindFirstFile ?

Corollaire: comment prendre un nom de fichier de type const char* et le placer dans un formulaire que FindFirstType acceptera?

FindFirstFile est une macro définie comme suit:

 #ifdef UNICODE #define FindFirstFile FindFirstFileW #else #define FindFirstFile FindFirstFileA #endif // !UNICODE 

Cela signifie que son extension à celle avec un W lorsqu’il est compilé avec UNICODE défini, et son extension à celle avec un A sinon.

Le premier paramètre de LPCSTR est LPCSTR ou LPWCSTR . LPCSTR est un typedef pour const char* tandis que LPWCSTR est un typedef pour const wchar_t* . Dans votre message d’erreur, vous essayez de passer un type de const char* tant que premier argument à FindFirstFileW qui prend un argument de type const wchar_t* , d’où l’erreur.

Pour que les types correspondent, vous devez passer un object de type const wchar_t* , vous avez plusieurs options:

 std::wssortingng path1 = L"..."; // 1 const wchar_t* path2 = L"..."; // 2 wchar_t path3[] = L"..."; // 3 WIN32_FIND_DATA w32fd; FindFirstFile(path1.c_str(), &w32fd); // 1 FindFirstFile(path2, &w32fd); // 2 FindFirstFile(path3, &w32fd); // 3 FindFirstFile(L"...", &w32fd); 

Comment prendre un nom de fichier de type const char * et le placer dans un formulaire que FindFirstType acceptera?

Si votre nom de fichier contient uniquement des caractères dans le jeu de caractères ASCII de base, vous pouvez le convertir en std::wssortingng comme suit: std::wssortingng path(std::begin(filename), std::end(filename)); . Sinon, vous devrez utiliser MultiByteToWideChar ou de nombreuses options présentées ici . Une autre option serait d’appeler FindFirstFileA directement, mais si vous êtes sur Windows, il serait généralement préférable d’utiliser wchar_t pour commencer.

Le type d’entrée attendu est const wchar_t * si vous comstackz pour unicode. (Ce que vous êtes: le ‘W’ nous le dit.). Le type d’entrée attendu est const char * si vous ne comstackz pas pour unicode. Avant de résoudre votre problème, vous devez décider de comstackr ou non pour Unicode. Si vous optez pour unicode, vos chaînes doivent être wchar_t * ou std :: wssortingng ou CSsortingng. Cela devrait faire disparaître votre problème.

Si vous avez réellement besoin d’utiliser un const char * dans une application compilée Unicode, vous devez convertir le const char * en une chaîne const wchar_t * en appelant la fonction API MultiByteToWideChar.