如何以编程方式检测和定位Windows 10 SDK?

Ter*_*ros 12 windows sdk winapi visual-studio windows-10

TL; DR

是否有Windows注册表项(或其他易于编程的方式)来查找和检测适用于SDK V10.0的Windows SDK?


我在做类似的东西这个,利用一些伴随着工装的视窗10 SDK.

我正在寻找一种检测和定位Windows SDK程序方法.此技术必须适用于(至少)10.0版本(此问题的当前版本).最好,我想要一种适用于所有版本的技术(世界和平也会很好).

以前的版本(至少高达V8.1A - 与Visual Studio 2013一起提供)可通过Windows注册表检测到.(虽然V <7.0 可能不是).

对于64位安装: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows(请注意32位的粗体差异).

而对于32位安装: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\WindowsHKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\Windows

(有关MSDN Windows SDK博客的更多信息).

但是,V10.0(或Visual Studio 2015中包含的V10.0A)不像以前的版本那样创建注册表项!

有些技术使用编译器宏检测 SDK版本.但是,这些对于SDK工具使用(xsd.exe等)来说并不实用,因为它们需要整个编译步骤 - 这不一定会产生SDK工具目录的路径!

理想情况下,这应该可以使用PowerShell或批处理脚本或其他一些可以包含在构建脚本或其他自动化环境中的简单方法来实现(毕竟它们是编程工具).


注意:

有办法做到这一点通过询问文件系统,(编程上市的子目录%ProgramFiles(x86)%\Microsoft SDKs\Windows\,解析了"V"和"A'S和选择max()10.0列出的数字(等的)...

但是,这些方法有许多缺点:

  1. 相当笨重(文件系统访问,字符串解析等)
  2. 容易出错,从错误卸载的SDK中剩余的空文件夹可能会导致笨重的目录解析.
  3. 根据路径差异,通过平台( %ProgramFiles(x86)%在x64上,但%ProgramFiles%在32位上)和SDK版本; SDK <7在Bin目录中定位工具,而SDK> 7使用bin\NETFX X.X tools(注意小写'b',只是为了增加不一致性).
  4. 还受用户安装选择的限制(例如,"聪明"系统管理员在C:\ Stuff\WinSDK\V10.0 \中安装了SDK).

因此,这将是MUCH更好的编程方式实现这一目标,比如通过注册表(这是可能的以前的Windows SDK版本)


这个问题不是一个重复的这一个,因为这个问题既是询问不同的SDK版本,并且还询问一个程序(注册表等)的方式找到SDK路径.

它也不是一个重复的这个,因为这个问题与CMake的专门处理和涉及到集结号不匹配.

Chr*_*isD 9

到目前为止,我发现的最好方法是查看 Visual Studio 的 dev 命令是如何做到的。目前(2019 年)可以在Visual Studio 目录winsdk.bat下找到它.\Common7\Tools\vsdevcmd\core\。如果将来再次发生变化,这应该会有所帮助。即使winsdk.bat重命名或重组,希望仍然包含类似的脚本。

在我的系统上,相关部分目前如下所示:

:GetWin10SdkDir

call :GetWin10SdkDirHelper HKLM\SOFTWARE\Wow6432Node > nul 2>&1
if errorlevel 1 call :GetWin10SdkDirHelper HKCU\SOFTWARE\Wow6432Node > nul 2>&1
if errorlevel 1 call :GetWin10SdkDirHelper HKLM\SOFTWARE > nul 2>&1
if errorlevel 1 call :GetWin10SdkDirHelper HKCU\SOFTWARE > nul 2>&1
if errorlevel 1 exit /B 1
exit /B 0


:GetWin10SdkDirHelper

@REM `Get Windows 10 SDK installed folder`
for /F "tokens=1,2*" %%i in ('reg query "%1\Microsoft\Microsoft SDKs\Windows\v10.0" /v "InstallationFolder"') DO (
    if "%%i"=="InstallationFolder" (
        SET WindowsSdkDir=%%~k
    )
)

@REM `get windows 10 sdk version number`
setlocal enableDelayedExpansion

@REM `Due to the SDK installer changes beginning with the 10.0.15063.0 (RS2 SDK), there is a chance that the
@REM Windows SDK installed may not have the full set of bits required for all application scenarios.
@REM We check for the existence of a file we know to be included in the "App" and "Desktop" portions
@REM of the Windows SDK, depending on the Developer Command Prompt's -app_platform configuration.
@REM If "windows.h" (UWP) or "winsdkver.h" (Desktop) are not found, the directory will be skipped as
@REM a candidate default value for [WindowsSdkDir].`
set __check_file=winsdkver.h
if /I "%VSCMD_ARG_APP_PLAT%"=="UWP" set __check_file=Windows.h

if not "%WindowsSdkDir%"=="" for /f %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO (
    @REM `Skip if Windows.h|winsdkver (based upon -app_platform configuration) is not found in %%i\um.`
    if EXIST "%WindowsSdkDir%include\%%i\um\%__check_file%" (
        set result=%%i
        if "!result:~0,3!"=="10." (
            set SDK=!result!
            if "!result!"=="%VSCMD_ARG_WINSDK%" set findSDK=1
        )
    )
)
Run Code Online (Sandbox Code Playgroud)


dxi*_*xiv 6

我没有它的权威来源,但它从Windows 10 SDK的卸载程序追溯,并在我看过的几台机器上检出:

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots
KitsRoot10="C:\Program Files (x86)\Windows Kits\10\"
Run Code Online (Sandbox Code Playgroud)

确切的版本有点难以猜测,因为例如10.0.10150.0,10.0.10240.0并且10.0.10586.0所有子目录都在C:\Program Files (x86)\Windows Kits\10\Include.


pok*_*oke 5

我的Windows Kits密钥不包含有关 v10 Windows SDK 的任何信息。但是,我在以下注册表路径中找到了有关它的信息:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK
Run Code Online (Sandbox Code Playgroud)

在里面,有已安装的 .NET 版本的子项。我有4.6, 4.6.1, 和4.6.2

这些键中的每一个都包含一个值InstallationFolder,该值指向安装 SDK 的文件夹(这将是C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\),以及一个值KitsInstallationFolder,该值包含指向包含库的工具包的路径 ( C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\)。

更有趣的是(至少对我来说),每个键还包含三个按键:WinSDK-NetFx40ToolsWinSDK-NetFx40Tools-x64,和WinSDK-NetFx40Tools-x86。每个键都有一个值InstallationFolder,其中包含指定 SDK 版本的工具文件夹的绝对路径。

因此,对于我的用例,我现在在 PowerShell 中执行以下操作以将文件夹获取到最新的 SDK 工具:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK
Run Code Online (Sandbox Code Playgroud)