2011-01-13 10 views
16

Co to różnica z tych 2 funkcji ?:"APIENTRY _tWinMain" i "WINAPI WinMain" różnica

int APIENTRY _tWinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 

int WINAPI WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 
+0

jeśli zdefiniowano _UNICODE, potem drugi przykład to błąd, ponieważ LPTSTR byłoby WSTR i nie pasuje WinMain, zarówno WINAPI i APIENTRY są zdefiniowane jako __stdcall – Kaije

+0

prawym przyciskiem myszy na _tWinMain -> wybierz przejść do definicji ... – Jimbo

+7

Twoja deklaracja WinMain() nie jest poprawna, trzecim argumentem jest LPSTR. Oba są archaiczne, powinieneś używać dzisiaj wWinMain. –

Odpowiedz

41

_tWinMain tylko #define skrót w tchar.h do odpowiedniej wersji WinMain.

Jeśli zdefiniowano _UNICODE, wówczas _tWinMain rozszerza się do wWinMain. W przeciwnym razie _tWinMain jest taka sama jak WinMain.

Odpowiedni makro wygląda mniej więcej tak (jest faktycznie dużo inny kod przeplatane):

#ifdef _UNICODE 
#define _tWinMain wWinMain 
#else 
#define _tWinMain WinMain 
#endif 
+0

To jest poprawna odpowiedź! – Nawaz

1

Od this link:

_tWinMain faktycznie bierze parametr hPrevInstance, ale parametr nie jest używany.

_tWinMain jest po prostu #define do WinMain (w TCHAR.h).

Nie ma różnicy między dwa.

i

_tWinMain jest zdefiniowana WinMain jeśli UNICODE nie jest zdefiniowany, a do wWinMain jeśli to jest. jego celem jest pozwala napisać kod, który zbuduje zarówno pod ansi jak i pod Unicode.

+2

Inne posty dalej na tej samej stronie, którą łączysz, sugerują, że nie są dokładnie takie same. Różnica między nimi zależy od tego, czy zdefiniowano "_UNICODE". –

+0

@Cody Tak, dobry połów. – chrisaycock

16

Różnica polega kodowanie parametrów, które są całkowicie zbędne i tak. Po prostu wyrzucić parametry i zamiast korzystać z następujących, gdzie można kontrolować Kodowanie:

hInstance tylko GetModuleHandle(0)

hPrevInstance nie jest ważny w Win32 i tak

lpCmdLine jest dostępna zarówno ANSI i Unicode, poprzez GetCommandLineA() i GetCommandLineW(), odpowiednio

nCmdShow jest parametrem wShowWindow o strukturze STARTUPINFO. Ponownie, warianty ANSI i Unicode, dostępne za pomocą GetStartupInfoA(STARTUPINFOA*) i GetStartupInfoW(STARTUPINFOW*).

Używając interfejsów API Win32, aby uzyskać do nich dostęp, prawdopodobnie zachowasz kilka zmiennych globalnych, na przykład ostrożnie zapisując uchwyt instancji, który według Ciebie był dostępny tylko dla WinMain.

+0

To powinno mieć więcej upvotes ... – Kevin