in src/vswhere.lib/InstanceSelector.cpp [98:166]
vector<ISetupInstancePtr> InstanceSelector::Select(_In_opt_ IEnumSetupInstances* pEnum) const
{
vector<ISetupInstancePtr> instances;
if (pEnum)
{
HRESULT hr = S_OK;
unsigned long celtFetched = 0;
ISetupInstance* pInstances[1] = {};
do
{
celtFetched = 0;
hr = pEnum->Next(1, pInstances, &celtFetched);
if (SUCCEEDED(hr) && celtFetched)
{
ISetupInstancePtr instance(pInstances[0], false);
if (IsMatch(instance))
{
instances.push_back(instance);
}
}
} while (SUCCEEDED(hr) && celtFetched);
}
if (m_args.get_Legacy() && m_provider.HasLegacyInstances())
{
vector<LPCWSTR> versions =
{
L"14.0",
L"12.0",
L"11.0",
L"10.0",
};
for (const auto version : versions)
{
ISetupInstancePtr instance;
// Currently only support version checks.
if (m_provider.TryGetLegacyInstance(version, &instance) && IsVersionMatch(instance))
{
instances.push_back(instance);
}
}
}
if (1 < instances.size())
{
if (m_args.get_Latest() || m_args.get_Sort())
{
sort(instances.begin(), instances.end(), [&](const ISetupInstancePtr& a, const ISetupInstancePtr& b) -> bool
{
// Reverse the sort with addition of -sort using existing algorithm.
return !Less(a, b);
});
if (m_args.get_Latest())
{
return vector<ISetupInstancePtr>
{
instances.front(),
};
}
}
}
return instances;
}