2009-11-24 11 views
16

L'unica differenza è che Winmain accetta char * per il parametro lpCmdLine, mentre wWinMain accetta wchar_t *.Differenza tra WinMain e wWinMain

In Windows XP, se una voce dell'applicazione è WinMain, Windows converte la riga di comando da Unicode ad Ansi e passa all'applicazione?

Se il parametro della riga di comando deve essere in Unicode (ad esempio, nome file Unicode, la conversione causerà la mancanza di alcuni caratteri), significa che è necessario utilizzare wWinMain come funzione di immissione?

risposta

12

In Windows XP, se una voce di applicazione è WinMain, fa di Windows converte la riga di comando da Unicode ad ANSI e passare alla domanda?

Sì.

Se il parametro di riga di comando deve essere in Unicode (ad esempio, Unicode nome del file, la conversione causerà alcuni caratteri mancanti), vuol dire che devo usare wWinMain come la funzione di inserimento?

Sì, dovresti, se vuoi gestire correttamente gli argomenti Unicode nel tuo programma.

Anche la documentazione su WinMain() on MSDN è d'accordo.

È tuttavia possibile utilizzare anche GetCommandLineW per recuperare la riga di comando in modo specifico in Unicode.

-1

Windows XP verso l'alto è unicode per impostazione predefinita! E quindi, non è richiesta alcuna conversione. Il loader di C++ Runtime si occupa dell'argomento che passa all'applicazione. L'API Win32 standard indica che la voce principale è WinMain (...).

+4

"Nota che lpCmdLine utilizza il tipo di dati LPSTR invece del tipo di dati LPTSTR. Ciò significa che WinMain non può essere utilizzato dai programmi Unicode." (http://msdn.microsoft.com/en-us/library/ms633559.aspx) – Joey

+0

Grazie Johannes per l'avviso e per avermelo ricordato. – t0mm13b

+1

Windows NT4 è Unicode di default :) –

1

WinMain/wWinMain non è il vero punto di ingresso di Windows. Windows chiama semplicemente la funzione specificata nell'intestazione PE con parametri zero.

Quando si utilizza la catena di strumenti Microsoft, questo è void WinMainCRTStartup() { ... } quando si crea un'applicazione GUI e viene fornito a meno che non si colleghi a /Zl.

L'impostazione predefinita WinMainCRTStartup codice creato da Visual C++ inizializza la libreria di runtime di linguaggio C, chiamate costruttori globali (se presente) e poi chiama la funzione WinMain/wWinMain con un HINSTANCE dal GetModuleHandle(NULL), la riga di comando da GetCommandLineA/W() (saltando gli over il nome file nella riga di comando) e il comando show da GetStartupInfo.

L'unica differenza tra WinMain e wWinMain è la stringa di riga di comando e si dovrebbe utilizzare wWinMain nelle applicazioni Unicode (e tutte le applicazioni create in questi giorni dovrebbero usare Unicode). Ovviamente puoi chiamare manualmente GetCommandLineW() in WinMain e analizzarlo autonomamente se lo desideri.

In Windows NT/2000/XP e versioni successive la riga di comando è una stringa Unicode internamente e WinMain/GetCommandLineA() fornisce una versione convertita di questa che potrebbe non essere in grado di rappresentare correttamente ogni singolo carattere. Su Windows 95/98/ME è il contrario, ma GetCommandLineW() è sempre in grado di convertire ogni carattere da GetCommandLineA().