WinMain入口点 - VS Linker vs Windows API

时间:2016-01-21 21:50:14

标签: windows assembly x86-64 masm

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

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 Linker入口点设置?是不同的,即C ++运行时与OS?

1 个答案:

答案 0 :(得分:2)

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

相反,您的主要功能应与相关标准相对应:WinMain()用于GUI应用程序,或main()用于控制台应用程序。

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

signature of the native entry point

DWORD CALLBACK RawEntryPoint(void);

重要提示:

从原始入口点返回隐式调用ExitThread(请参阅this answer),这通常不是正确的事情,因为如果Windows API创建了您不知道的任何线程,则该过程获胜直到他们这样做才退出。请注意,Windows API文档并不总是指示特定API函数何时可能导致创建线程。

相反,您应该显式调用ExitProcess。这是从WinMain()或main()返回时C运行时库执行的操作。