2021年11月

Visual Studio 2010
Ultimate: YCFHQ-9DWCY-DKV88-T2TMH-G7BHP

Visual Studio 2013
Professional: XDM3T-W3T3V-MGJWK-8BFVD-GVPKY
Premium: FBJVC-3CMTX-D8DVP-RTQCT-92494
Ultimate: BWG7X-J98B3-W34RT-33B3R-JVYW9
Team Foundation Server: MHG9J-HHHX9-WWPQP-D8T7H-7KCQG

Visual Studio 2015
Professional: HMGNV-WCYXV-X7G9W-YCX63-B98R2
Enterprise: HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
Visual Studio 2017
Test Professional: VG622-NKFP4-GTWPH-XB2JJ-JFHVF
Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH | 4F3PR-NFKDB-8HFP7-9WXGY-K77T7
Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF | N2VYX-9VR2K-T733M-MWD9X-KQCDF

Visual Studio 2019
Professional: NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y | NJVYC-BMHX2-G77MM-4XJMR-6Q8QF
Enterprise: BF8Y8-GN2QH-T84XB-QVY3B-RC4DF | KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

Visual Studio 2022
Professional: TD244-P4NB7-YQ6XK-Y8MMM-YWV2J
Enterprise: VHF9H-NXBBB-638P6-6JHCY-88JWH

Visual Studio 2022: https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes

Visual Studio 2019: https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes

Visual Studio 2017: https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2017-relnotes

Visual Studio 2015: https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2015-update3-vs

Visual Studio 2013: https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2013-update5-vs

Visual Studio 2012: https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2012-update4-vs

Visual Studio 2010: https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2010-sp1-vs

微软什么的最讨厌啦~写个 GUI 程序要么带个控制台窗口,要么就得用非主流的 WinMain 函数作入口。

用 gcc 的话,这其实不是个问题,带上一个 -mwindows 参数即可顺利解决掉控制台窗口并且抛弃 WinMain。

而到了 Visual Studio,似乎很两难:

Linker 参数中 SubSystem 选择 Windows 可以去除控制台窗口,但会要求用 WinMain 作入口。
Linker 参数中 SubSystem 选择 Console 可以使用 main 作入口,但会自带控制台窗口。
于是困惑了。好在今天在 Irrlicht 的教程中见到了解法:

Linker 参数中的 SubSystem 继续选择 Windows,与此同时将 Entry Point 设置为 mainCRTStartup 即可兼得鱼和熊掌。

以命令行参数形式就是:/SUBSYSTEM:windows /ENTRY:mainCRTStartup

要点就是 ENTRY 参数有三种:mainCRTStartup、WinMainCRTStartup、和 _DllMainCRTStartup,分别对应调用 main、WinMain、和 DllMain,默认是根据 /DLL 和 /SUBSYSTEM 参数自动选择的。

#ifdef _DEBUG
    #ifdef UNICODE
        #pragma comment(linker, "/subsystem:\"console\" /entry:\"wWinMainCRTStartup\"")
    #else
        #pragma comment(linker, "/subsystem:\"console\" /entry:\"WinMainCRTStartup\"")
    #endif
#endif