impossible de convertir le paramètre 1 de 'const char *' to 'LPCWSTR'
Fondamentalement, j'ai un code simple qui fait des choses pour les fichiers et je vais essayer de port pour windows. J'ai quelque chose qui ressemble à ceci:
int SomeFileCall(const char * filename){
#ifndef __unix__
SomeWindowsFileCall(filename);
#endif
#ifdef __unix__
/**** Some unix only stat code here! ****/
#endif
}
la ligne SomeWindowsFileCall(filename);
provoque l'erreur du compilateur:
cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
Comment puis-je résoudre ce problème sans changer le SomeFileCall
prototype?
LPCWSTR
est const wchar_t *
- ce qui est une chaîne de caractères larges.Voir Travailler avec des Chaînes de caractères pour plus de détails.
double possible de impossible de convertir le paramètre 1 de 'char *' to 'LPCWSTR'
OriginalL'auteur john-charles | 2012-05-23
Vous devez vous connecter pour publier un commentaire.
Plus de l'Api Windows qui prennent les chaînes sont disponibles en deux versions: l'une qui prend
char *
et celui qui prendWCHAR *
(ce dernier est équivalent àwchar_t *
).SetWindowText
, par exemple, est en fait une macro qui permet de soitSetWindowTextA
(qui prendchar *
) ouSetWindowTextW
(qui prendWCHAR *
).Dans votre projet, il semble que tous ces macros sont la référence à l'-W versions. Ceci est contrôlé par le
UNICODE
macro préprocesseur (qui est défini si vous choisissez "Utiliser le Jeu de Caractères Unicode" du projet dans Visual Studio). (Certains de Microsoft, C et C++ moment de l'exécution des fonctions de la bibliothèque ont également ANSI et large versions. Celle que vous obtenez est sélectionné par le même nom de_UNICODE
macro qui est également définie par le projet Visual Studio.)Généralement, à la fois de l'Un et de l'-W fonctions existent dans les bibliothèques et sont disponibles, même si votre application est compilée pour l'Unicode. (Il y a des exceptions; certaines nouvelles fonctions sont disponibles uniquement en "large" des versions.)
Si vous avez un
char *
qui contient du texte dans la bonne page de codes ANSI, vous pouvez appeler la version de façon explicite (p. ex.,SetWindowTextA
). L'Une des versions sont généralement des wrappers qui font de grande des copies de caractères de la chaîne de paramètres et de passer le contrôle à l'-W versions.Une alternative est de faire votre propre caractère large des copies des cordes. Vous pouvez faire cela avec MultiByteToWideChar. L'appelant peut être difficile, parce que vous avez à gérer les tampons. Si vous pouvez vous en sortir avec l'appel de l'-Une version directement, c'est généralement plus simple et déjà testé. Mais si votre
char *
chaîne est en UTF-8 ou un codage autre que la page de codes ANSI, vous devriez faire la conversion vous-même.Bonus Info
L'-Un suffixe signifie "ANSI", qui a été la commune de Windows terme pour un octet de code de la page de jeu de caractères.
Le suffixe-W signifie "Large" (le sens de l'encodage des unités plus larges qu'un seul octet). Plus précisément, Windows utilise little-endian UTF-16 pour les chaînes étendues. La documentation MSDN appelle simplement ce "Unicode", qui est un peu un abus de langage.
ReadDirectoryChangesW
.Yep,
CommandLineToArgvW
en est une autre. Aussi, apparemment, Windows CE a la W versions de la plupart (tous?) fonctions pour réduire la taille du code, mais pas accordée trop grand nombre de personnes de la cible Windows CE ces jours-ci.L'appel de la
-A
version peut être plus simple, mais il utilise le "ANSI" page de code. Donc, si votre code utilise l'UTF-8 pour les chaînes, vous devrez convertir de toute façon. Et vous ne serez pas en mesure d'ouvrir des fichiers avec des caractères non ANSI dans leurs noms.OriginalL'auteur Adrian McCarthy
Configurer votre projet pour utiliser jeu de caractères ANSI. (Général -> Jeu de Caractères)
Quelles sont TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR etc.
typedef const wchar_t* LPCWSTR;
OriginalL'auteur Ruben
Vous construisez avec WinApi en mode Unicode, donc tous les paramètres de la chaîne de résoudre à l'échelle de cordes. La solution la plus simple serait de changer la WinApi à la norme ANSI, sinon, vous devez créer un
wchar_t*
avec le contenu defilename
et de l'utiliser comme un argument.OriginalL'auteur K-ballo
pas sûr de ce que le compilateur que vous utilisez, mais dans visual studio, vous pouvez spécifier la valeur par défaut du type char, que ce soit UNICODE ou multi-octets. Dans votre cas, il semble que si UNICODE par défaut est donc la solution la plus simple est de vérifier que le commutateur sur votre compilateur qui détermine la valeur par défaut du type char parce qu'il serait vous faire économiser un peu de travail, sinon vous allez finir par l'ajout de code pour convertir en arrière à partir de l'UNICODE qui peut ajouter des frais généraux inutiles plus pourrait être une nouvelle source de l'erreur.
OriginalL'auteur Anders
Suis capable de résoudre cette erreur en définissant le jeu de Caractères à "Utilisation Multi-Byte Character set"
[Propriétés du projet-> Propriétés de Configuration -> Général> Jeu de Caractères ->"Utilisation Multi-Byte Character set"
OriginalL'auteur Kishan