Marvin's Blog【程式人生】

Ability will never catch up with the demand for it

27 Jun 2021

从Win32到WIL

Writing Win32 apps like it’s 2020: Introduction 阅读笔记

2021年,Win32 API依然被广泛使用。虽然一些跨平台解决方案,比如QT和Electron也不错。

umpteenth: 经过无数次后又一次的

除了Win32外,又有MFC(Microsoft Foundation Classes)(如今依然存在),还有ATL(Active Template Library)(用于编写COM,如今依然存在),然后基于ATL又有WTL(Windows Template Libarary)(可以看成ATL对于MFC的解决方案,不过有点缺乏官方支持)。

另一个三字命名的框架叫做WIL(Windows Implementation Library),独立于ATL之外的又一个大杂烩。WIL有许多好处,但是缺乏一些向后兼容性https://github.com/microsoft/wil/issues/97#issuecomment-540369663

.NET也对Win32提供了封装,例如做界面用的WinForms(Windows Forms Libarry)。虽然.NET上的C#语言蛮好用的,但是.NET框架本身显得臃肿、混乱。这可能是把.NET框架和操作系统深度集成这把双刃剑所带来的黑暗面。即便.NET Core和.NET Native试图把.NET从系统中独立出来,从而减少依赖,但是它重大问题是不支持老系统。

还有很多五花八门的解决方案,比如WinRT,UWP,WinJS,ReactXP,以及近期的WinUI。对于早期的电脑和系统,这些解决方案都不是可选项。

所以作者的结论看似是继续使用C++来电泳Win32 API。Writing Win32 apps like it’s 2020: Helpers for a modern C++ world 介绍了这方面的一些技巧。

win32metadata

可能微软从.NET认识到,让APP依赖于API,会让API被锚定,从而无法演进。一个变通的办法是让APP依赖于API的描述。这些描述以元数据形态存在,与语言无关。而不像Win32 API那样跟C语言绑死。

win32metadata 就是Win32 API元数据化的一个努力。让不同语言写封装的时候容易一些。对应于C++的封装是cppwin32 ,跟WinRT的封装有点类似,但项目前景尚不明朗。Making Win32 APIs More Accessible to More Languages 这篇文章对win32metadata 的背景做了一些介绍。

https://www.libhunt.com/r/wil可以看到一些相关的程序库。VisualStudio的文档Overview of Windows Programming in C++ 对如何让Win32和C++友好相处有一些描述。

wil

通过C++头文件形式提供。

  • include/wil/resource.h,智能指针,方便通过RAII管理Win32 API中的Handle,Hwnd。
  • include/wil/win32_helpers.h,提供Win32 API调用上的便利
  • include/wil/registry.h,注册表监察器
  • include/wil/result.h,为处理Win32 API执行错误提供便利

使用方式:

  • 从Github下载源代码
  • 使用名为Microsoft.Windows.ImplementationLibrary的NuGet包
  • 通过vcpkg安装

(本篇完)

Categories

Tags