这2个功能有什么区别?:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
_tWinMain
只是 tchar.h 中 #define
相应版本的 WinMain
快捷方式。
如果定义了
_UNICODE
,则 _tWinMain
扩展为 wWinMain
。否则,_tWinMain
与 WinMain
相同。
相关宏看起来像这样(实际上还散布了很多其他代码):
#ifdef _UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif
区别在于参数的编码,无论如何都是完全冗余的。 只需扔掉参数并使用以下参数即可控制编码:
hInstance
只是GetModuleHandle(0)
hPrevInstance
无论如何在 Win32 中无效
lpCmdLine
可分别通过 GetCommandLineA()
和 GetCommandLineW()
获得 ANSI 和 Unicode 版本
nCmdShow
是 wShowWindow
结构的 STARTUPINFO
参数。 同样,ANSI 和 Unicode 变体,可使用 GetStartupInfoA(STARTUPINFOA*)
和 GetStartupInfoW(STARTUPINFOW*)
访问。
通过使用 Win32 API 来访问这些变量,您可能会保存一些全局变量,例如您小心地保存您认为仅适用于
WinMain
的实例句柄的变量。
来自此链接:
_tWinMain 实际上确实采用了 hPrevInstance 参数,但是 未使用参数。
_tWinMain 只是 WinMain 的#define(在 TCHAR.h 中)。
两者没有区别 两个。
和
如果未定义 UNICODE,则_tWinMain 被定义为 WinMain,并且 wWinMain 如果是的话。其目的是 让你编写可以构建的代码 在 ansi 和 unicode 下都可以。
这是 Ben Vogt 建议的包装器,无需智能配置和链接即可工作。
#include <windows.h>
int _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow);
int main(int nArgs, char* args[])
{
HINSTANCE hInstance = GetModuleHandle(0);
HINSTANCE hPrevInstance = NULL;
LPTSTR cmdLine = GetCommandLine();
STARTUPINFO startupInfo;
GetStartupInfoA(&startupInfo);
int nCmdShow = startupInfo.wShowWindow;
int res = _tWinMain(hInstance, hPrevInstance, cmdLine, nCmdShow);
return res;
}