use MSVC without VS

因为有打算,未来去学习C++,今天在复习C语言的时候,突然冒出一个点子。也不算突然吧,暑假的时候我还想在macOS下学习C++,后来发现有些麻烦,最后就有了Surface Laptop小本子,我觉得这是学习Windows下C++开发的绝佳利器啊。当然,这也跟我这学期的一门课有关--《面向对象课程设计》,说是一定要使用C++&MFC作为技术栈。其实我第一次听到的时候,我想说,WTF? 就在刚刚,在Google的时候,我发现,我不妨换个思路,从了解VS&MFC的源头开始,自己先找找一些MFC有关的小东西看看。虽然我很想拿一些新东西来做,我觉得从源头开始溯源,一定是件有意思的事情,这也跟我最近迷上科技史有关。

我突然对微软这家公司,充满了兴趣,也就是在用上Surface Laptop之后,重新配置Win开发本,感觉一切又好熟悉。我有这样一个想法,我试图去阅读有关微软公司的历史,它们的一些技术和产品的历史等等。这就要提到MFC,这虽然是一个很老的玩意吧,MFC的出现尤其历史原因,我想去简单了解下,我觉得有这个必要,这对于理解新技术有帮助,理解这种演变。

Windows与Win API

1993年 Windows NT发布,1995年 Windows95发布,2001年 WindowsXP发布,2009年Windows7发布,2015年7月29日 Windows10发布,2021年6月24日 Windows11发布。 这里参照了b站视频,【【进化史】Windows系统(1985-2021)| 精益求精】 https://www.bilibili.com/video/BV1C64y1Q7N1/?share_source=copy_web&vd_source=59d47afd43812c161ca8ef67a1dfea4d

我比较喜欢的版本就是Windows10,一直以来都是,我Surface上跑的也是Win10,不知不觉都七八年过去了,貌似22H2到2025年结束,那这也是Win10十周年了,到时候一定要庆祝下。

A scoped and streamlined update
Windows 10, version 22H2 is a scoped release focused on quality improvements to the overall Windows experience in existing feature areas such as quality, productivity and security. We will deliver the 2022 Update using servicing technology (like that used for the monthly update process) to meet our customers’ needs based on feedback. For consumer or commercial users with devices running version 20H2 or later, the 2022 Update will have a fast installation experience. Home and Pro editions of the 2022 Update will receive 18 months of servicing, and Enterprise and Education editions will have 30 months of servicing. More information can be found on the Microsoft Lifecycle Policy site and we will continue to support at least one version of Windows 10 through Oct. 14, 2025.
https://blogs.windows.com/windowsexperience/2022/10/18/how-to-get-the-windows-10-2022-update/
https://learn.microsoft.com/zh-cn/windows/release-health/release-information

所以,Windows10的生命周期还挺长的,到25年停更之前,我还是会坚定的使用Win10。 上面两个网址,第一个是这段引用的原文,第二个是有关Windows10的版本信息收录。

Windows API

在了解Windows时间线之前,我们需要去了解下Windows API。
https://learn.microsoft.com/en-us/windows/apps/get-started/start-here
直接从 Microsoft Learn 开始

1985年11月20日,Windows1.0发布,这是MS-DOS的图形化版本(这个表述不太严谨,但也没啥大错),刚看Windows API也是在这个时候发布的,那是不是二者有什么联系呢?

Win32

https://learn.microsoft.com/en-us/windows/win32/

Win32 is the 32-bit application programming interface (API) for 32-bit versions of Windows (NT, 95, and later versions). The API consists of functions implemented, as with Win16, in system DLLs. The core DLLs of Win32 are kernel32.dll, user32.dll, and gdi32.dll. Win32 was introduced with Windows NT. The version of Win32 shipped with Windows 95 was initially referred to as Win32c, with c meaning compatibility. This term was later abandoned by Microsoft in favor of Win32.
https://en.wikipedia.org/wiki/Windows_API#Versions

图片源自:https://youtu.be/S4lQwJawOzI?si=zAwRp8OzB1zy7j71&t=96

这个油管视频推荐去看看,讲了Winodws.h和.dll的区别。所以说,Win32也是一套Windows API,一直到现在(Win11)。关于API的理解,最开始我在了解到时候,也很迷。其实,可以很简单的去理解,你要让台灯亮,你把插座?插进去,好灯?亮了。这个插座口就可以理解成API,至于电怎么来的,这个你不用管,就如上图这座冰山一样。你会用就行,至于这个规范,就是二插口不能插三插口的电器吧,超过220v不能直接插(这个220v,哎呀这里举例就是说电压不一样,电器不能混用,就跟你海淘的美版xxx,需要个转换头一样),这个就是API规范,你遵守这个规范就行了,至于你接台灯、接电脑、接冰箱什么的,我电力公司不关心你,给我交点费就行。这就让我想到很多,微信公号还是什么,过一段时间给你发条消息说,这个tx说我滥用这个接口了,我不能再提供什么推送服务或者什么的。

WinRT

https://www.youtube.com/watch?v=rJxQnhiK4TQ
上面这个微软官方的说明视频,解释了什么是WinRT。

  • WinRT是一种使用WinAPI的新方法
  • 100%兼容C++,C++17
  • 代码可读性高 readable code,生成是二进制文件更小 smaller binary

https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/intro-to-using-cpp-with-winrt

目前,微软官方是比较推荐使用WinRT的。

Win32和WinRT区别

Win32 API和WinRT API都是用于Windows桌面应用程序开发的API,但它们有一些重要的区别:

  1. 年代和历史:

    • Win32 API(Windows API):Win32 API是从Windows 3.x开始引入的,它是Windows桌面应用程序开发的传统API。它基于C语言,并且具有很长的历史,支持广泛的Windows应用程序。
    • WinRT API:WinRT(Windows Runtime)是在Windows 8中引入的,它是一种新的应用程序模型,旨在支持通用Windows应用程序(通常是Metro或Modern应用程序)的开发。WinRT API基于面向对象的编程模型,支持多种编程语言,如C++, C#, 和JavaScript。
  2. 编程模型:

    • Win32 API:Win32 API使用了传统的过程式编程模型,开发者需要处理消息循环、窗口过程等。它使用了C语言风格的函数调用。
    • WinRT API:WinRT API使用了基于COM(Component Object Model)的对象模型,它支持面向对象的编程,开发者可以使用类和接口来创建应用程序。
  3. 支持平台:

    • Win32 API:Win32 API是跨多个Windows平台的,包括Windows 95、98、NT、2000、XP、Vista、7等。它仍然是用于传统桌面应用程序的主要API。
    • WinRT API:WinRT API更加面向现代Windows平台,包括Windows 8及更高版本,特别是用于通用Windows应用程序(UWP)的开发。
  4. 语言支持:

    • Win32 API:虽然Win32 API主要是用C/C++编写的,但它也支持其他编程语言,如Delphi、Visual Basic等。
    • WinRT API:WinRT API更加多语言友好,支持多种编程语言,包括C++, C#, JavaScript和Visual Basic。
  5. 安全性和隔离:

    • Win32 API:Win32应用程序通常在受限的用户权限下运行,并且不受应用程序容器的隔离。
    • WinRT API:WinRT应用程序通常以沙箱模式运行,受到更严格的隔离和权限控制。

一旧一新,其实上面提到的UWP,我不喜欢这个打包?格式的应用,比较反感。但是,我还是比较想用WinRT&C++去开发现代Win桌面应用(Modern Win Desktop App)。

Changed:
https://blogs.windows.com/windowsdeveloper/2021/01/21/making-win32-apis-more-accessible-to-more-languages/

https://github.com/microsoft/windows-rs

Win32的使用会更加广泛,可以说贯穿整个Windows历史,Win32的“级别”会更高一些。看完这篇博文,看到Rust也可以去调WinRT,这意味着可以绕过C++,不妨一试。 后面还会提到,GUI开发,再提这个想法吧。

MSVC与MFC

还是说说MSVC,以下是wikipedia上的简介:

Microsoft Visual C++ (MSVC) is a compiler for the C, C++, C++/CLI and C++/CX programming languages by Microsoft. MSVC is proprietary software; it was originally a standalone product but later became a part of Visual Studio and made available in both trialware and freeware forms. It features tools for developing and debugging C++ code, especially code written for the Windows API, DirectX and .NET.
Many applications require redistributable Visual C++ runtime library packages to function correctly. These packages are frequently installed separately from the applications they support, enabling multiple applications to use the package with only a single installation. These Visual C++ redistributable and runtime packages are mostly installed for standard libraries that many applications use.[3]
https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B

MSVC是一个编译器,后文简称VC/Visual C++。在了解VC&MFC的时候,也需要关注下Windows操作系统的时间线,有关了解直接从wikipedia上了解是最直接的。

一点历史

Visual C++ 1.0 (original name: Visual C++ 32-bit Edition) released in 1993 was the first version for 32-bit development for the Intel 386 architecture.[11]
https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B

Visual C++ 2015 (also known as Visual C++ 14.0) was released on July 20, 2015.[41] It features improved C++11/14/17 support.

Visual C++ 1.0发布的时候,MFC2.0发布。

目前,MSVC 编译器已经发到14.3x版本。 最后来看,MFC(the Microsoft Foundation Class)其实是有它出现的历史局限性的,但并不是说MFC是“淘汰”的,它是有些过时的,不建议现在去搞。

WinUI3

【一次弄懂windows开发:MFC,Winform,WPF,UWP,Winui3】 【精准空降到 00:00】 https://www.bilibili.com/video/BV1QP411e78S/?share_source=copy_web&vd_source=59d47afd43812c161ca8ef67a1dfea4d&t=0

一些看完视频的笔记和思考:

  • MFC可以理解成把Win32封装?起来的一个东西
  • WinForm是把.net framework封装?起来的一个东西(这里是简写,具体可以去 Google)
  • WPF也是.NET那套东西
  • UWP 有点拉垮
  • WinUI2 有点拉垮
  • MAUI 一个跨平台开发框架
  • WinUI3 最新的,实现了“解耦合”。但是,存在平台限制,只能跑在Win10以及更高版本上,不过这一点我倒是不关心。

https://learn.microsoft.com/zh-cn/windows/apps/winui/winui3/

WinUI3还有个特性是,一是可以结合C++搞开发,二是可以结合.NET使用,但是不依赖于.NET(https://www.cnblogs.com/duwenlong/p/16488997.html 后面半句参考了这篇博文)。
缺点也有,上面也提了,跨平台做的不好,对老旧设备兼容性不好,还有就是资料太少。

关于WinUI,博客园上有一个不错的帖子:https://www.cnblogs.com/dino623/p/Get-started-with-WinUI-3-for-desktop-apps.html

Win桌面应用开发思考

从下图可以看到,不管是开发传统桌面应用还是跨平台应用,微软都给出了建议。

https://learn.microsoft.com/en-us/windows/apps/get-started/?tabs=winappsdk-winui%2Cnet-maui

回顾一下全文,这大半天的查资料和码字下来,我觉得Windows确实是一个超级复杂的操作系统,还有就是微软有很重的历史包袱,也看出了这一系列的技术变迁(演进),每种技术都有它存在的必然性和历史局限性,“常青树“是很少见的,如何去把握经典和新技术,也是一个值得思考的问题。

WinAppSDK

Windows 应用 SDK 是一组新的开发人员组件和工具,它们代表着 Windows 应用开发平台的下一步发展。 Windows 应用 SDK 提供一组统一的 API 和工具,可供从 Windows 11 到 Windows 10 版本 1809 上的任何桌面应用以一致的方式使用。
https://learn.microsoft.com/zh-cn/windows/apps/windows-app-sdk/

https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/

因为已经安装VS2022了,所以上述操作都可以省掉。
Win10应用开发的官方教程:
https://learn.microsoft.com/zh-cn/training/modules/get-started-with-visual-studio-for-windows10-app-dev/1-visual-studio-features

Modernize 桌面Apps

https://learn.microsoft.com/en-us/windows/apps/desktop/modernize/

  • 从语言层面: C#.NET、C++ 都行

  • UI层面:

    WinUI3应该能成,它做到了和操作系统解耦合。

  • API层面:Win32、WinRT都行

  • 打包?: MSIX package format 我感觉是这个能打的东西会丰富些

MSVC 单行版安装

上面扯了太多,总之开发现代Win桌面Apps,有两套技术栈可以选择,微软本身肯定还是推荐用 C# + xxx ,但是我后面有个课是一定要用C++,就没办法。虽然,我超级想去试试.NET6(or8),看看这门发展这么久的技术,有什么大变化。很久之前也关注过.NET技术,从它的“大一统”开始,我对它还挺感兴趣的,但是感兴趣归感兴趣hhh。

Build一下

因为VS安装确实很大很麻烦,它的核心可以说说是MSVC和一些组件吧(这里是我在yy了,对于VS我确实不懂)。就有一个想法,我能不能不装VS,把MSVC单独拎出来行不行?

看看这个gist:

This downloads standalone 64-bit MSVC compiler, linker & other tools, also headers/libraries from Windows SDK into portable folder, without installing Visual Studio. Has bare minimum components - no UWP/Store/WindowsRT stuff, just files & tools for 64-bit native desktop app development.
https://gist.github.com/mmozeiko/7f3162ec2988e81e56d5c4e22cde9977

下面这个更简单:https://github.com/Data-Oriented-House/PortableBuildTools


https://raw.githubusercontent.com/Data-Oriented-House/PortableBuildTools/master/screenshot.png

直接打包好!

back to C++

在微软learn上找到不错的modern cpp教程
https://learn.microsoft.com/en-us/cpp/cpp/welcome-back-to-cpp-modern-cpp?view=msvc-170

可以看出来微软在推荐使用Cpp17,作为cpp大厂,可以看出其对新技术的态度。这给我后面去学习cpp也提供了一个参照点,直接去学习modern cpp吧,不管是cpp11还是cpp17,我们需要modern。

相关推荐

浅谈:C, ASM & Register

主要参考书籍: 《微机原理与接口技术》 ISBN:9787302446453 《C指针编程之道》 ISBN:9 ...

C指针 篇2

指针在函数的应用 参考 《C指针编程之道》ISBN 9787115250841 主要内容如下: 指针作为函数参 ...

深入C++笔记 篇2

0.目录 什么是拷贝 拷贝需要考虑的几个问题 C++中的拷贝概念及操作 现代C++11 中的移动语义和右值引用 ...

暂无评论

发表评论

您的电子邮件地址不会被公开,必填项已用*标注。