2016-11-20 1 views
-1

Est-ce que quelqu'un sait quand nous devons utiliser la fonction Unicode plutôt que la fonction ANSI lorsque nous utilisons WinMain ou wWinMain? Ou pouvons-nous utiliser la fonction générique normale? Et aussi avec l'utilisation de WinMain ou wWinMain, cela affectera-t-il le type de paramètre utilisé dans une fonction?Fonctions et paramètres Unicode et ANSI basés sur WinMain et wWinMain

Par exemple, dans les deux tutoriels différents de création Windoes vides, un tutoriel de MSDN spécifie comme ceci:

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 
{ 
    ...  
    // Create the window. 

    HWND hwnd = CreateWindowEx(
     0,        // Optional window styles. 
     CLASS_NAME,      // Window class 
     L"Learn to Program Windows", // Window text 
     WS_OVERLAPPEDWINDOW,   // Window style 

     // Size and position 
     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 

     NULL,  // Parent window  
     NULL,  // Menu 
     hInstance, // Instance handle 
     NULL  // Additional application data 
     ); 

Tandis qu'un autre tutorial spécifie comme ceci:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
... 
    hwnd = CreateWindowEx(
     WS_EX_CLIENTEDGE, 
     g_szClassName, 
     "The title of my window", 
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, 
     NULL, NULL, hInstance, NULL); 

avis au titre de la fenêtre, on utilise L "Title" tandis qu'une autre utilise "Title", donc je suppose que selon les types de WinMain il affecte aussi le type de paramètres puisque autant que je sache wWinMain est utilisé pour Unicode et WinMain est pour ANSI.

Une autre question connexe si j'utilise wWinMain ou WinMain, puis j'utilise la fonction générique, comme MessageBox, résoudra-t-elle en MessageBoxW ou MessageBoxA en fonction du type WinMain?

Merci

+1

Si votre programme est conçu pour Unicode ou non est déterminé par l'option * Jeu de caractères * dans Visual Studio (ce qui définit la '' UNICODE' et _UNICODE 'macros). –

+0

@JonathanPotter quelle est la différence entre UNICODE et _UNICODE? –

+0

Juste l'héritage Je pense, certaines choses utilisent un et certaines choses utilisent l'autre. –

Répondre

2

WinMain() et wWinMain() ne touchent pas si le programme fonctionne comme ANSI ou Unicode ou non; Tout ce qu'il détermine est comment le paramètre pCmdLine est codé. (Vous devriez utiliser GetCommandLine() de toute façon car pCmdLine ne comprend pas le nom du programme, et éventuellement d'autres choses mais j'ai oublié où sur MSDN j'ai trouvé les avertissements ... Combinant GetCommandLineW() et CommandLineToArgvW() vous permettra d'obtenir une paire argc/argv même dans un programme qui utilise WinMain().)

ce qui décide si vos API sont ANSI ou Unicode sont les _UNICODE et UNICODE macros, mais vous êtes probablement mieux d'utiliser les fonctions W -suffixed explicitement (mais gardez les deux sens de toute façon) . Ce qui décide si vos fenêtres sont Unicode ou non, c'est si vous avez utilisé ou non RegisterClassW()/RegisterClassExW() sur la classe de fenêtre.

+0

Comment pouvons-nous vérifier les macros pour le programme? Dans le didacticiel, il n'utilise pas explicitement la fonction W end, alors peut-être que le compilateur sait quelle fonction spécifique sera exécutée en fonction des macros? –

+0

Oui, le compilateur sait. Le code dans les fichiers d'en-tête système utilise '# ifdef' pour voir si les en-têtes sont définis, et' #define FunctionNameHere FunctionNameHereW' (ou 'FunctionNameHereA') pour faire l'alias. Il y a aussi le système TCHAR, pour créer des programmes qui peuvent être compilés dans les deux sens. Vous n'avez plus besoin de le faire, sauf si vous devez toujours prendre en charge Windows 9x ou plus. La meilleure approche est de simplement utiliser Unicode partout, et si vous avez besoin d'ASCII, utilisez UTF-8 et convertissez en UTF-16 si nécessaire ('MultiByteToWideChar()'/'WideCharToMultiByte()'). – andlabs

+0

C'est le seul symbole du préprocesseur 'UNICODE' qui contrôle le jeu de caractères utilisé dans l'API Windows. '_UNICODE' contrôle le jeu de caractères utilisé par les fichiers d'en-tête C runtime. – IInspectable

0

vous, comme beaucoup, pleine de confusion en termes de manque de compréhension des choses fondamentales. tout d'abord, nous avons besoin de fixer directement ou indirectement le /ENTRY (Entry-Point Symbol) de notre exe. si aucune option /ENTRY:function directe n'est définie, les valeurs par défaut de l'éditeur de liens sont: sélectionnez wWinMainCRTStartup lorsque UNICODE et /SUBSYSTEM:WINDOWS et WinMainCRTStartup si /SUBSYSTEM:WINDOWS mais UNICODE non défini. wWinMainCRTStartup appel interne wWinMain lorsque WinMainCRTStartup appel interne WinMain. donc choisir le point d'entrée dépend de UNICODE défini ou non, mais seulement si /ENTRY:function n'est pas réglé directement. on peut par exemple définir UNICODE mais régler /ENTRY:WinMainCRTStartup et avoir besoin d'être implémenté "ANSI" WinMain. et à tout ce que nous ne pouvons pas utiliser CRT tout et défini comme EP toute fonction propre

sur l'utilisation A ou W version de fonctions dans le code - dire MessageBox ce n'est que macro qui a étendu à la forme dépendante MessageBoxW ou MessageBoxA sont UNICODE est défini en temps de compilation. Cependant, nous ne pouvons pas utiliser les noms de macro mais de fonctions complètes.afin que nous puissions mélanger même code MessageBoxA et CreateFileW, CreateProcessA et CreateWindowExW