WinMain 入口点 - VS 链接器 vs Windows API

WinMain entry point - VS Linker vs Windows API

我一直在通过 Visual Studio 配置设置我的应用程序(MASM 汇编语言程序)入口点,在项目属性中为:

Linker\System\SubSystem:    Windows (/SUBSYSTEM:WINDOWS)
Linker\Advanced\Entry Point:    WinMain

任何我的名为 WinMain 的主程序(匹配上述设置)。这是一个基本的应用程序,可以进行简单的 Windows API 调用,例如MessageBoxA... 并且有效。

现在我正在构建一个 Window 应用程序(在汇编中),我在某处读到我需要调用 WinMain Windows API 作为入口点。

我现在很困惑!我使用哪种技术来设置我的应用程序 (exe) 的入口点? Windows API 调用 'WinMain' 或 Visual Studio 链接器入口点设置?区别是什么,即 C++ 运行时与 OS?

如果您使用的是 C 运行时库(用 C 编程时通常是这种情况),那么您不得自己指定链接器入口点。如果这样做,运行时库将无法正确初始化,任何运行时库调用(包括编译器插入的调用)都可能失败。

相反,您的主要功能应符合相关标准:WinMain() for a GUI application, or main() 对于控制台应用程序。

在未链接到 C 运行时库的汇编语言程序中,您应该指定您选择的入口点。

signature of the native entry point

DWORD CALLBACK RawEntryPoint(void);

重要提示:

从原始入口点返回隐式调用 ExitThread(参见 ),这通常不是正确的做法,因为如果 Windows API 创建了任何线程你不知道,在他们这样做之前,这个过程不会退出。请注意,Windows API 文档并不总是指示特定 API 函数何时可能导致创建线程。

相反,您应该显式调用 ExitProcess。当您从 WinMain() 或 main() 中 return 时,这就是 C 运行时库所做的。