WinMain 应用程序入口点

每个 Windows 程序都包含一个名为 WinMainwWinMain 的入口点函数。 以下代码显示了 wWinMain 的签名:

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

四个 wWinMain 参数如下所示:

  • hInstance实例的句柄 或模块的句柄。 当可执行文件加载到内存中时,操作系统使用此值来标识可执行文件或 EXE。 某些 Windows 函数需要实例句柄,例如加载图标或位图。
  • hPrevInstance 没有任何意义。 它在 16 位 Windows 中使用,但现在始终为零。
  • pCmdLine 以 Unicode 字符串的形式包含命令行参数。
  • nCmdShow 是一个标志,指示主应用程序窗口是最小化、最大化还是正常显示。

函数返回一个 int 值。 操作系统不使用返回值,但你可以使用 该值将状态代码传递给另一个程序。

调用约定(如 WINAPI)定义函数如何从调用方接收参数。 例如,调用约定定义参数在堆栈上的显示顺序。 请确保声明 wWinMain 函数,如前面的示例所示。

WinMain 函数与 wWinMain 相同,只是命令行参数作为 ANSI 字符串传递。 首选 Unicode 字符串。 即使将程序编译为 Unicode,也可以使用 ANSI WinMain 函数。 若要获取命令行参数的 Unicode 副本,请调用 GetCommandLine 函数。 此函数返回单个字符串中的所有参数。 如果希望参数作为 argv 样式的数组,请将此字符串传递给 CommandLineToArgvW

编译器如何知道调用 wWinMain 而不是标准 main 函数? 实际上, (CRT) 的 Microsoft C 运行时库提供了调用 WinMainwWinMainmain 实现。

CRT 在 main 中执行更多工作。 例如,它在 wWinMain 之前调用任何静态初始值设定项。 尽管可以告知链接器使用不同的入口点函数,但如果链接到 CRT,则应使用默认值。 否则,将跳过 CRT 初始化代码,并产生不可预知的结果,例如未正确初始化全局对象。

以下代码显示了一个空 的 WinMain 函数:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

现在,你已拥有入口点并了解一些基本术语和编码约定,接下来可以 创建第一个 Windows 程序