我可以混合使用 winapi 和 main() 吗?

时间:2021-06-17 05:55:27

标签: c winapi

书籍和在线资源中的大多数 Windows API hello world 程序都有固定的形式。程序以 WinMain() 开始,它创建并注册窗口并进入消息循环直到结束。

#include <windows.h>

int main(void)
{
    MessageBox(NULL, "content", "title", 0);
    
    /*
     *
     * code which use any functions in 'windows.h'
     * 
     * 
     */

    return 0;
}

但是,这种形式也合法吗?

1 个答案:

答案 0 :(得分:4)

首先:符号 mainWinMain约定1。使用任何一个,甚至一个完全不同的符号作为入口点,都不会改变程序的任何内容。具体来说,无论选择哪个入口点符号,都可以使用整个 Windows API。

当依赖于运行时,约定就变成了契约性的。绝大多数用 C 编写的应用程序都使用 C 运行时 (CRT)。 Microsoft 的 CRT 实现要求程序提供一个名为 mainWinMain(或相应的 Unicode 变体)的入口点,它可以在初始化后调用。

Microsoft 的 CRT 是否需要 mainWinMain 取决于 /SUBSYSTEM 链接器选项。当以 CONSOLE 子系统为目标时,CRT 需要符号 main。相反,当以 WINDOWS 子系统为目标时,它需要 WinMain

针对 CONSOLEWINDOWS 子系统的可执行映像是相同的,只有一个例外:操作系统将自动为针对 CONSOLE 子系统的程序分配控制台,并且不会为面向 WINDOWS 子系统的程序分配控制台。其他都一样。

<块引用>

但是,这种形式也合法吗?

是的,这是完全合法的。一切都一样(以传入入口点的参数为模),但系统会为您分配一个控制台。特别是对于学习而言,这是一个很好的临时解决方案,可以获取 printf 样式的日志记录/跟踪。


1 WinMain is just the conventional name for the Win32 process entry point