WIL - Windows 实现库


MIT
Windows
C/C++

软件简介

Windows Implementation Libraries (WIL) 是一个只包含头文件的 C 库,可以让 Windows
开发者通过易读的类型安全的 C
接口来实现通用的 Windows 编码模式。

主要包括:

  • include/wil/resource.h (documentation): Smart pointers and auto-releasing resource wrappers to let you manage Windows API HANDLEs, HWNDs, and other resources and resource handles with RAII semantics.
  • include/wil/win32_helpers.h: Wrappers for API functions that save you the work of manually specifying buffer sizes, calling a function twice to get the needed buffer size and then allocate and pass the right-size buffer, casting or converting between types, and so on.
  • include/wil/registry.h: Registry watchers that can call a lambda function or callback you provide whenever a certain tree within the Windows registry changes.
  • include/wil/result.h (documentation): Preprocessor macros to help you check for errors from Windows API functions, in many of the myriad ways those errors are reported, and surface them as error codes or C++ exceptions in your code.

WIL can be used by C code that uses C exceptions as well as code that uses
returned error codes to report errors. All of WIL can be used from user-space
Windows code, and some (such as the RAII resource wrappers) can even be used
in kernel mode.

Consuming WIL via NuGet

You can consume WIL via a NuGet package. To do so, follow the instructions on
nuget.org.
This package includes the header files under the
include directory as
well as a
.targets
file

Building/Testing

To get started testing WIL, first make sure that you have a recent version of
Visual Studio installed. If you are doing any non-trivial work, also be sure
to have a recent version of Clang installed. Once everything is installed,
open a VS native command window (e.g. “x64 Native Tools Command Prompt for VS
2019”). From here, you can either invoke CMake directly:

C:\wil> mkdir build
C:\wil> cd build
C:\wil\build> cmake -G Ninja ..

Or through one of the scripts in the
scripts directory:

C:\wil> scripts\init.cmd -c clang -g ninja -b debug

If you initialized using Ninja as the generator, you can build the tests like
so:

C:\wil\build\clang64debug> ninja

Or, if you want to only build a single test (e.g. for improved compile times):

C:\wil\build\clang64debug> ninja witest.noexcept

If you initialized using MSBuild as the generator, there will be a .sln file
in the root of the build directory. You can either open the solution in Visual
Studio or invoke MSBuild directly to build.

The output is a number of test executables. If you used the initialization
script(s) mentioned above, or if you followed the same directory naming
convention of those scripts, you can use the
runtests.cmd
script, which will execute any test executables that have been built, erroring
out - and preserving the exit code - if any test fails. Note that MSBuild will
modify the output directories, so this script is only compatible with using
Ninja as the generator. If you are at the tail end of of a change, you can
execute the following to get a wide range of coverage:

C:\wil> scripts\init_all.cmd
C:\wil> scripts\build_all.cmd
C:\wil> scripts\runtests.cmd

Note that this will only test for the architecture that corresponds to the
command window you opened. You will want to repeat this process for the other
architecture (e.g. by using the “x86 Native Tools Command Prompt for VS 2019”)