【问题标题】:"APIENTRY _tWinMain" and "WINAPI WinMain" difference“APIENTRY _tWinMain”和“WINAPI WinMain”的区别
【发布时间】:2011-01-13 15:00:01
【问题描述】:

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

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
  • 右击_tWinMain -> 选择去定义...
  • 您的 WinMain() 声明不正确,第三个参数是 LPSTR。两者都是过时的,您今天应该使用 wWinMain。

标签: c++ windows winapi winmain


【解决方案1】:

_tWinMain 只是 tchar.h 中的一个 #define 快捷方式,指向相应版本的WinMain

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

相关的宏看起来像这样(实际上还有很多其他代码穿插):

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

【讨论】:

    【解决方案2】:

    不同之处在于参数的编码,无论如何都是完全多余的。只需丢弃参数,而是使用以下控制编码的地方:

    hInstance 只是GetModuleHandle(0)

    hPrevInstance 在 Win32 中无论如何都无效

    lpCmdLine 可用于 ANSI 和 Unicode,分别通过 GetCommandLineA()GetCommandLineW()

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

    通过使用 Win32 API 访问这些,您可能会保存一些全局变量,例如您仔细保存您认为只有 WinMain 可用的实例句柄的那个。

    【讨论】:

      【解决方案3】:

      来自this link

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

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

      两者没有区别 两个。

      _tWinMain 如果未定义 UNICODE,则定义为 WinMain,并且 wWinMain 如果是。其目的是 让您编写将构建的代码 ansi 和 unicode 下都有。

      【讨论】:

      • 您链接的同一页面上的其他帖子进一步表明它们不完全相同。两者的区别取决于是否定义了_UNICODE
      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 2014-08-12
      • 2011-11-25
      • 2015-09-23
      • 2023-03-14
      • 2021-12-14
      相关资源
      最近更新 更多