2010-02-22 6 views
2

Je lis un livre et Il m'a dit d'ouvrir un projet WIN32 vide. J'ai créé le fichier source appelé main.cpp et le mettre dans le dossier source (c'est le seul fichier que j'ai dans mon projet). Dans ce fichier, entrez le code suivant:: erreur C2664: 'MessageBoxW': impossible de convertir le paramètre 2 à partir de 'const char [40]'

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, int nShowCmd) 
{ 
    MessageBox(NULL, "Motoko kusangai has hacked your system!", "Public Security Section 9", MB_OK | MB_ICONEXCLAMATION); 
} 

Exécutez-le. Mais j'obtiens l'erreur suivante:

1>c:\users\numerical25\documents\visual studio 2008\projects\begin\begin\main.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [40]' to 'LPCWSTR' 
1>  Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>Build log was saved at "file://c:\Users\numerical25\Documents\Visual Studio 2008\Projects\Begin\Begin\Debug\BuildLog.htm" 
1>Begin - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Qu'est-ce que je fais mal?

Répondre

7

Vous devez utiliser une grande chaîne dans ce cas parce que vous compilez pour unicode. Essayez préfixer toutes vos constantes de chaîne avec L.

MessageBox(
    NULL, 
    L"Motoko kusangai has hacked your system!", 
    L"Public Security Section 9", 
    MB_OK | MB_ICONEXCLAMATION); 
+0

Votre droit! Merci beaucoup. Et je pensais que je savais beaucoup de programmation. C++ est un jeu de balle complètement nouveau. Je suis unformiluar avec la compilation pour Unicode. Connaissez-vous de bonnes ressources qui explique ce que sont ces ?? Et pourquoi le compilateur de livres n'en avait-il pas besoin et je l'ai fait. eux aussi utilisent MSV. Je ne sais pas quelle version mais l'interface semble complètement identique. – numerical25

+0

haha, tant pis, plus tard, il explique que j'obtiendrai une erreur: P. Je déteste quand les livres font ça. – numerical25

+0

il dit d'utiliser L ou TCHAR – numerical25

2

essayer

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, int nShowCmd) 
{ 
    MessageBox(NULL, _T("Motoko kusangai has hacked your system!"), _T("Public Security Section 9"), MB_OK | MB_ICONEXCLAMATION); 
} 

Chaque fois que vous obtenez cette erreur pour un texte statique, placez le texte statique dans les balises _T().

Edit: MS Link

+0

_T() ne fonctionnait pas dans ce cas. – numerical25

+0

oh .. étrange, n'a pas utilisé C++ dans un certain temps, mais était sûr qu'il était _T, L "" doit travailler alors :) Vive –

+1

Pour la compilation 32 bits, vous auriez raison. Pour 64 bits, MS a fait des chaînes larges par défaut, sans définir _UNICODE, ce qui signifie que '_T' et' TEXT' ne fonctionnent pas (dans ces circonstances). –

4

Programmation classique Petzold Windows démarre avec un grand chapitre sur Unicode que je vous recommande la lecture. Si vous allez faire n'importe quel travail Win32 UI j'obtiendrais une copie de son livre. Étant donné que Win32 est de moins en moins populaire ces jours-ci, vous pouvez prendre des copies de la 5e édition la plus récente pour moins de 20 $. Contrairement à la plupart des auteurs techniques, Charles a un style très conversationnel et utilise de fortes techniques de narration pour rendre ses livres très lisibles malgré leur longueur (ses fenêtres de programmation avec C# étaient également bonnes).

Il est une bonne pratique ces jours-ci d'utiliser des chaînes unicode, mais si vous ne voulez pas vraiment vous pouvez aller dans les propriétés du projet dans VS et changer le jeu de caractères « utilisation de caractères multi-octets », ce qui vous donnera essentiellement l'ASCII 8 bits habituel auquel vous êtes probablement habitué.

0

J'ai eu l'erreur similaire et le passage à "Utiliser le jeu de caractères multi-octets" a fonctionné pour moi. J'utilise Visual Studio 2012.

Questions connexes