فهرست منبع

VS: Fix crash finding vswhere on 32-bit Windows

Since commit f85913fa08 (VS: Add support for enumerating VS instances
with vswhere, 2022-04-11, v3.24.0-rc1~282^2), if the COM lookup does not
report any VS instances, we fall back to finding vswhere.  However, the
`getenv` call returns nullptr if the `ProgramFiles(x86)` environment
variable is not set.  Update the logic to tolerate not-set environment
variables.  Also check the plain `ProgramFiles` environment variable.

Fixes: #24090
Brad King 3 سال پیش
والد
کامیت
6eee8c9000
1فایلهای تغییر یافته به همراه21 افزوده شده و 2 حذف شده
  1. 21 2
      Source/cmVSSetupHelper.cxx

+ 21 - 2
Source/cmVSSetupHelper.cxx

@@ -300,13 +300,32 @@ bool cmVSSetupAPIHelper::IsEWDKEnabled()
   return false;
 }
 
+#if !defined(CMAKE_BOOTSTRAP)
+namespace {
+std::string FindVsWhereCommand()
+{
+  std::string vswhere;
+  static const char* programFiles[] = { "ProgramFiles(x86)", "ProgramFiles" };
+  for (const char* pf : programFiles) {
+    if (cmSystemTools::GetEnv(pf, vswhere)) {
+      vswhere += "/Microsoft Visual Studio/Installer/vswhere.exe";
+      if (cmSystemTools::FileExists(vswhere)) {
+        return vswhere;
+      }
+    }
+  }
+  vswhere = "vswhere.exe";
+  return vswhere;
+}
+}
+#endif
+
 bool cmVSSetupAPIHelper::EnumerateVSInstancesWithVswhere(
   std::vector<VSInstanceInfo>& VSInstances)
 {
 #if !defined(CMAKE_BOOTSTRAP)
   // Construct vswhere command to get installed VS instances in JSON format
-  std::string vswhereExe = getenv("ProgramFiles(x86)") +
-    std::string(R"(\Microsoft Visual Studio\Installer\vswhere.exe)");
+  std::string vswhereExe = FindVsWhereCommand();
   std::vector<std::string> vswhereCmd = { vswhereExe, "-format", "json" };
 
   // Execute vswhere command and capture JSON output