“APIENTRY _tWinMain”和“WINAPI WinMain”区别

问题描述 投票:0回答:4

这2个功能有什么区别?:

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

int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
c++ windows winapi winmain
4个回答
53
投票

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

如果定义了

_UNICODE
,则
_tWinMain
扩展为
wWinMain
。否则,
_tWinMain
WinMain
相同。

相关宏看起来像这样(实际上还散布了很多其他代码):

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

29
投票

区别在于参数的编码,无论如何都是完全冗余的。 只需扔掉参数并使用以下参数即可控制编码:

hInstance
只是
GetModuleHandle(0)

hPrevInstance
无论如何在 Win32 中无效

lpCmdLine
可分别通过
GetCommandLineA()
GetCommandLineW()
获得 ANSI 和 Unicode 版本

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

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

WinMain
的实例句柄的变量。


1
投票

来自此链接

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

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

两者没有区别 两个。

如果未定义 UNICODE,则

_tWinMain 被定义为 WinMain,并且 wWinMain 如果是的话。其目的是 让你编写可以构建的代码 在 ansi 和 unicode 下都可以。


0
投票

这是 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.