【问题标题】:What is the correct entry point for a Win32 console app? [duplicate]Win32 控制台应用程序的正确入口点是什么? [复制]
【发布时间】:2016-11-16 18:51:32
【问题描述】:

我目前正在开发适用于 Windows 10 的控制台应用程序,我想知道 main() 入口点应该是什么。

在 Jeffrey Richter 和 Christophe Nasarre 的“Windows via C/C++”(2007 年)第 69 页中,它指出:

您的 Windows 应用程序必须具有入口点函数...作为 C/C++ 开发人员,您可以使用两个可能的入口点函数:

int WINAPI _tWinMain(HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int nCmdShow);

int _tmain(int argv, TCHAR *argv[], TCHAR *envp[]);

这本书接着确定这两个入口点实际上是由编译器映射到不同的入口点,这取决于应用程序是 GUI 还是控制台以及是否使用 Unicode。

我想为使用 Unicode 的 Win32 控制台应用程序使用正确的入口点,所以我假设(?),我想要 _tmain 版本,但是当我在 Visual Studio 2015 社区版中打开一个新项目并选择“ Win32 控制台应用程序”,然后选择“控制台应用程序”,我最终得到了 main(),就像我在 Linux 下习惯的那样:

int main()

我应该使用哪个入口点?

【问题讨论】:

  • 我会使用wmain 并避免像瘟疫一样使用TCHARstackoverflow.com/questions/2438049/…
  • TCHAR 理论上允许你编译为 ansi 或 unicode。在实践中,你要么永远不会同时编译,要么如果你这样做,它就不是你唯一需要改变的事情了。
  • 如果您无法使用main() 而不是wmain(),您仍然可以在控制台应用程序中使用GetCommandLineW()CommandLineToArgvW() 来获取Unicode 命令行参数。
  • “这本书继续确定这两个入口点实际上是由编译器映射到不同的入口点” - 这是在 crt0.c,一个 CRT 实现文件,在 2013 年之前与 Visual Studio 一起发布。它包含推断用户提供的入口点的所有逻辑,以及许多有用的 cmets。不幸的是,VS 2015 中缺少此文件。
  • @IInspectable - mcrtexe.cpp(靠近第 152 行)具有与 crt0.c 相同的关于入口点的块注释。我没有追踪所有逻辑来查看它们是否匹配,但它们看起来很相似。 (顺便mcrtexe.cpp顶部的注释调用文件crtexe.c

标签: c++ winapi unicode


【解决方案1】:

第一个入口点(或变体)通常用于 GUI 进程:

int WINAPI _tWinMain(HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int nCmdShow);

第二个入口点(或变体)通常用于命令行过程:

int _tmain(int argv, TCHAR *argv[], TCHAR *envp[]);

使用 /ENTRY 链接器选项设置入口点。 Visual Studio 会在您创建 GUI/控制台项目时为您设置此设置,并且您通常不需要更改它。见:https://msdn.microsoft.com/en-us/library/f9t8842e.aspx

使用 tchar.h 时通常会使用 _T 前缀。这使得应用程序(理论上)可以很容易地编译为“Ansi”或 Unicode。您可以在之前的答案中阅读更多相关信息:

What is the difference between _tmain() and main() in C++?

【讨论】:

  • 问题中的入口点和您通过/ENTRY链接器选项设置的入口点是不同的东西。前者是 CRT 使用的签名和符号,后者指定 OS 加载器看到的符号。
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多