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

21

这两个函数有什么区别?

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

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

如果你定义了_UNICODE,那么第二个例子会出错,因为LPTSTR将变成WSTR,并且与WinMain不匹配,同时WINAPI和APIENTRY都被定义为__stdcall。 - Kaije
右键单击 _tWinMain -> 选择转到定义... - Jimbo
9
您的WinMain()声明不正确,第三个参数应该是LPSTR。这两者都已经过时,今天您应该使用wWinMain。 - Hans Passant
3个回答

53

_tWinMain是一个位于tchar.h中的#define快捷方式,用于指向适当版本的WinMain

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

对应的宏看起来像这样(实际上还有许多其他的代码插入其中):

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

28
区别在于参数的编码方式,但这些参数完全是多余的。只需丢弃这些参数,取而代之的是使用以下方式,您可以控制编码方式: hInstance 就是 GetModuleHandle(0) hPrevInstance 在 Win32 中无效 lpCmdLine 可以通过 GetCommandLineA()GetCommandLineW() 访问 ANSI 和 Unicode 两种格式。 nCmdShowSTARTUPINFO 结构的 wShowWindow 参数。同样地,有 ANSI 和 Unicode 两种形式:通过 GetStartupInfoA(STARTUPINFOA*)GetStartupInfoW(STARTUPINFOW*) 访问。
通过使用 Win32 API 访问这些内容,您可能会节省一些全局变量,例如您认为仅在 WinMain 中可用的实例句柄。

1

来自此链接

_tWinMain实际上确实需要hPrevInstance参数,但是该参数没有被使用。

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

两者之间没有区别。

如果UNICODE未定义,则_tWinMain定义为WinMain,如果定义了,则定义为wWinMain。其目的是让您编写可在ansi和unicode下构建的代码。


2
同一页面下面的其他帖子表明它们并不完全相同。这两者之间的区别取决于是否定义了“_UNICODE”。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接