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.