“APIENTRY _tWinMain”和“WINAPI WinMain”的区别

时间:2011-01-13 15:00:01

标签: c++ windows winapi winmain

这两个功能有什么不同?:

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

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

3 个答案:

答案 0 :(得分:45)

_tWinMain只是tchar.h中的#define快捷方式,适用于WinMain的相应版本。

如果定义了_UNICODE,则_tWinMain会扩展为wWinMain。否则,_tWinMainWinMain相同。

相关的宏看起来像这样(实际上有很多其他代码散布在一起):

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

答案 1 :(得分:20)

不同之处在于参数的编码,无论如何都是完全冗余的。只需丢弃参数,然后使用以下命令控制编码:

hInstance只是GetModuleHandle(0)

无论如何

hPrevInstance在Win32中无效

lpCmdLine同时提供ANSI和Unicode,分别通过GetCommandLineA()GetCommandLineW()

nCmdShowwShowWindow结构的STARTUPINFO参数。同样,使用GetStartupInfoA(STARTUPINFOA*)GetStartupInfoW(STARTUPINFOW*)访问ANSI和Unicode变体。

通过使用Win32 API来访问这些,您可能会保存一些全局变量,例如您小心保存您认为仅适用于WinMain的实例句柄的变量。

答案 2 :(得分:1)

来自this link

  

_tWinMain实际上确实采用了hPrevInstance参数,但是   参数不被使用。

     

_tWinMain只是WinMain的#define(在TCHAR.h中)。

     

之间没有区别   2。

  如果未定义UNICODE,则

_tWinMain定义为WinMain,并且   wWinMain如果是的话。它的目的是为了   让你编写将构建的代码   在ansi和unicode下都有。