Remove Wow6432Node versions of Visual Studio registry keys
The Visual Studio registry keys are stored in the 32 bit view. Extend qt_readRegistryKey with an option that enables the caller to choose the 32 bit or 64 bit registry view. We now read the Visual Studio registry keys from the 32 bit registry view even in a 64 bit build. Adding the next Visual Studio version will become a bit easier. Change-Id: I7300b992be6058f30a422e3f1fe0bafade6eea54 Reviewed-by: Oliver Wolff <oliver.wolff@theqtcompany.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
This commit is contained in:
parent
3304ea8f0e
commit
cbb2ce0f91
@ -142,18 +142,8 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
|
|||||||
|
|
||||||
const bool isPhone = project->isActiveConfig(QStringLiteral("winphone"));
|
const bool isPhone = project->isActiveConfig(QStringLiteral("winphone"));
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
QString regKeyPrefix;
|
QString regKey = QStringLiteral("Software\\Microsoft\\VisualStudio\\") + msvcVer + ("\\Setup\\VC\\ProductDir");
|
||||||
#if !defined(Q_OS_WIN64) && _WIN32_WINNT >= 0x0501
|
const QString vcInstallDir = qt_readRegistryKey(HKEY_LOCAL_MACHINE, regKey, KEY_WOW64_32KEY);
|
||||||
BOOL isWow64;
|
|
||||||
IsWow64Process(GetCurrentProcess(), &isWow64);
|
|
||||||
if (!isWow64)
|
|
||||||
regKeyPrefix = QStringLiteral("Software\\");
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
regKeyPrefix = QStringLiteral("Software\\Wow6432Node\\");
|
|
||||||
|
|
||||||
QString regKey = regKeyPrefix + QStringLiteral("Microsoft\\VisualStudio\\") + msvcVer + ("\\Setup\\VC\\ProductDir");
|
|
||||||
const QString vcInstallDir = qt_readRegistryKey(HKEY_LOCAL_MACHINE, regKey);
|
|
||||||
if (vcInstallDir.isEmpty()) {
|
if (vcInstallDir.isEmpty()) {
|
||||||
fprintf(stderr, "Failed to find the Visual Studio installation directory.\n");
|
fprintf(stderr, "Failed to find the Visual Studio installation directory.\n");
|
||||||
return false;
|
return false;
|
||||||
@ -161,13 +151,13 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
|
|||||||
|
|
||||||
QString windowsPath;
|
QString windowsPath;
|
||||||
if (isPhone) {
|
if (isPhone) {
|
||||||
windowsPath = "Microsoft\\Microsoft SDKs\\WindowsPhoneApp\\v";
|
windowsPath = "Software\\Microsoft\\Microsoft SDKs\\WindowsPhoneApp\\v";
|
||||||
} else {
|
} else {
|
||||||
windowsPath = "Microsoft\\Microsoft SDKs\\Windows\\v";
|
windowsPath = "Software\\Microsoft\\Microsoft SDKs\\Windows\\v";
|
||||||
}
|
}
|
||||||
|
|
||||||
regKey = regKeyPrefix + windowsPath + winsdkVer + QStringLiteral("\\InstallationFolder");
|
regKey = windowsPath + winsdkVer + QStringLiteral("\\InstallationFolder");
|
||||||
const QString kitDir = qt_readRegistryKey(HKEY_LOCAL_MACHINE, regKey);
|
const QString kitDir = qt_readRegistryKey(HKEY_LOCAL_MACHINE, regKey, KEY_WOW64_32KEY);
|
||||||
if (kitDir.isEmpty()) {
|
if (kitDir.isEmpty()) {
|
||||||
fprintf(stderr, "Failed to find the Windows Kit installation directory.\n");
|
fprintf(stderr, "Failed to find the Windows Kit installation directory.\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -70,21 +70,6 @@ struct DotNetCombo {
|
|||||||
const char *versionStr;
|
const char *versionStr;
|
||||||
const char *regKey;
|
const char *regKey;
|
||||||
} dotNetCombo[] = {
|
} dotNetCombo[] = {
|
||||||
#ifdef Q_OS_WIN64
|
|
||||||
{NET2015, "MSVC.NET 2015 (14.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\14.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2013, "MSVC.NET 2013 (12.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\12.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2013, "MSVC.NET 2013 Express Edition (12.0)", "Software\\Wow6432Node\\Microsoft\\VCExpress\\12.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2012, "MSVC.NET 2012 (11.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\11.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2012, "MSVC.NET 2012 Express Edition (11.0)", "Software\\Wow6432Node\\Microsoft\\VCExpress\\11.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2010, "MSVC.NET 2010 (10.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\10.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2010, "MSVC.NET 2010 Express Edition (10.0)", "Software\\Wow6432Node\\Microsoft\\VCExpress\\10.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2008, "MSVC.NET 2008 (9.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\9.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2008, "MSVC.NET 2008 Express Edition (9.0)", "Software\\Wow6432Node\\Microsoft\\VCExpress\\9.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2005, "MSVC.NET 2005 (8.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2005, "MSVC.NET 2005 Express Edition (8.0)", "Software\\Wow6432Node\\Microsoft\\VCExpress\\8.0\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2003, "MSVC.NET 2003 (7.1)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\7.1\\Setup\\VC\\ProductDir"},
|
|
||||||
{NET2002, "MSVC.NET 2002 (7.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\7.0\\Setup\\VC\\ProductDir"},
|
|
||||||
#else
|
|
||||||
{NET2015, "MSVC.NET 2015 (14.0)", "Software\\Microsoft\\VisualStudio\\14.0\\Setup\\VC\\ProductDir"},
|
{NET2015, "MSVC.NET 2015 (14.0)", "Software\\Microsoft\\VisualStudio\\14.0\\Setup\\VC\\ProductDir"},
|
||||||
{NET2013, "MSVC.NET 2013 (12.0)", "Software\\Microsoft\\VisualStudio\\12.0\\Setup\\VC\\ProductDir"},
|
{NET2013, "MSVC.NET 2013 (12.0)", "Software\\Microsoft\\VisualStudio\\12.0\\Setup\\VC\\ProductDir"},
|
||||||
{NET2013, "MSVC.NET 2013 Express Edition (12.0)", "Software\\Microsoft\\VCExpress\\12.0\\Setup\\VC\\ProductDir"},
|
{NET2013, "MSVC.NET 2013 Express Edition (12.0)", "Software\\Microsoft\\VCExpress\\12.0\\Setup\\VC\\ProductDir"},
|
||||||
@ -98,7 +83,6 @@ struct DotNetCombo {
|
|||||||
{NET2005, "MSVC.NET 2005 Express Edition (8.0)", "Software\\Microsoft\\VCExpress\\8.0\\Setup\\VC\\ProductDir"},
|
{NET2005, "MSVC.NET 2005 Express Edition (8.0)", "Software\\Microsoft\\VCExpress\\8.0\\Setup\\VC\\ProductDir"},
|
||||||
{NET2003, "MSVC.NET 2003 (7.1)", "Software\\Microsoft\\VisualStudio\\7.1\\Setup\\VC\\ProductDir"},
|
{NET2003, "MSVC.NET 2003 (7.1)", "Software\\Microsoft\\VisualStudio\\7.1\\Setup\\VC\\ProductDir"},
|
||||||
{NET2002, "MSVC.NET 2002 (7.0)", "Software\\Microsoft\\VisualStudio\\7.0\\Setup\\VC\\ProductDir"},
|
{NET2002, "MSVC.NET 2002 (7.0)", "Software\\Microsoft\\VisualStudio\\7.0\\Setup\\VC\\ProductDir"},
|
||||||
#endif
|
|
||||||
{NETUnknown, "", ""},
|
{NETUnknown, "", ""},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -125,7 +109,8 @@ DotNET which_dotnet_version(const QByteArray &preferredVersion = QByteArray())
|
|||||||
int installed = 0;
|
int installed = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(; dotNetCombo[i].version; ++i) {
|
for(; dotNetCombo[i].version; ++i) {
|
||||||
QString path = qt_readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey);
|
QString path = qt_readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey,
|
||||||
|
KEY_WOW64_32KEY);
|
||||||
if (!path.isEmpty() && installPaths.value(dotNetCombo[i].version) != path) {
|
if (!path.isEmpty() && installPaths.value(dotNetCombo[i].version) != path) {
|
||||||
lowestInstalledVersion = &dotNetCombo[i];
|
lowestInstalledVersion = &dotNetCombo[i];
|
||||||
installPaths.insert(lowestInstalledVersion->version, path);
|
installPaths.insert(lowestInstalledVersion->version, path);
|
||||||
|
@ -69,17 +69,11 @@ struct CompilerInfo{
|
|||||||
{CC_MINGW, "MinGW (Minimalist GNU for Windows)", 0, "g++.exe"},
|
{CC_MINGW, "MinGW (Minimalist GNU for Windows)", 0, "g++.exe"},
|
||||||
{CC_INTEL, "Intel(R) C++ Compiler for 32-bit applications", 0, "icl.exe"}, // xilink.exe, xilink5.exe, xilink6.exe, xilib.exe
|
{CC_INTEL, "Intel(R) C++ Compiler for 32-bit applications", 0, "icl.exe"}, // xilink.exe, xilink5.exe, xilink6.exe, xilib.exe
|
||||||
{CC_MSVC2005, "Microsoft (R) Visual Studio 2005 C/C++ Compiler (8.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\8.0", "cl.exe"}, // link.exe, lib.exe
|
{CC_MSVC2005, "Microsoft (R) Visual Studio 2005 C/C++ Compiler (8.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\8.0", "cl.exe"}, // link.exe, lib.exe
|
||||||
{CC_MSVC2005, "Microsoft (R) Visual Studio 2005 C/C++ Compiler (8.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\8.0", "cl.exe"}, // link.exe, lib.exe
|
|
||||||
{CC_MSVC2008, "Microsoft (R) Visual Studio 2008 C/C++ Compiler (9.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\9.0", "cl.exe"}, // link.exe, lib.exe
|
{CC_MSVC2008, "Microsoft (R) Visual Studio 2008 C/C++ Compiler (9.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\9.0", "cl.exe"}, // link.exe, lib.exe
|
||||||
{CC_MSVC2008, "Microsoft (R) Visual Studio 2008 C/C++ Compiler (9.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\9.0", "cl.exe"}, // link.exe, lib.exe
|
|
||||||
{CC_MSVC2010, "Microsoft (R) Visual Studio 2010 C/C++ Compiler (10.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\10.0", "cl.exe"}, // link.exe, lib.exe
|
{CC_MSVC2010, "Microsoft (R) Visual Studio 2010 C/C++ Compiler (10.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\10.0", "cl.exe"}, // link.exe, lib.exe
|
||||||
{CC_MSVC2010, "Microsoft (R) Visual Studio 2010 C/C++ Compiler (10.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\10.0", "cl.exe"}, // link.exe, lib.exe
|
|
||||||
{CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe
|
{CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe
|
||||||
{CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe
|
|
||||||
{CC_MSVC2013, "Microsoft (R) Visual Studio 2013 C/C++ Compiler (12.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0", "cl.exe"}, // link.exe, lib.exe
|
{CC_MSVC2013, "Microsoft (R) Visual Studio 2013 C/C++ Compiler (12.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0", "cl.exe"}, // link.exe, lib.exe
|
||||||
{CC_MSVC2013, "Microsoft (R) Visual Studio 2013 C/C++ Compiler (12.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0", "cl.exe"}, // link.exe, lib.exe
|
|
||||||
// Microsoft skipped version 13
|
// Microsoft skipped version 13
|
||||||
{CC_MSVC2015, "Microsoft (R) Visual Studio 2015 C/C++ Compiler (14.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VS7\\14.0", "cl.exe"}, // link.exe, lib.exe
|
|
||||||
{CC_MSVC2015, "Microsoft (R) Visual Studio 2015 C/C++ Compiler (14.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\14.0", "cl.exe"}, // link.exe, lib.exe
|
{CC_MSVC2015, "Microsoft (R) Visual Studio 2015 C/C++ Compiler (14.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\14.0", "cl.exe"}, // link.exe, lib.exe
|
||||||
{CC_UNKNOWN, "Unknown", 0, 0},
|
{CC_UNKNOWN, "Unknown", 0, 0},
|
||||||
};
|
};
|
||||||
@ -196,7 +190,8 @@ Compiler Environment::detectCompiler()
|
|||||||
QString paths = qgetenv("PATH");
|
QString paths = qgetenv("PATH");
|
||||||
QStringList pathlist = paths.toLower().split(";");
|
QStringList pathlist = paths.toLower().split(";");
|
||||||
for(int i = 0; compiler_info[i].compiler; ++i) {
|
for(int i = 0; compiler_info[i].compiler; ++i) {
|
||||||
QString productPath = qt_readRegistryKey(HKEY_LOCAL_MACHINE, compiler_info[i].regKey).toLower();
|
QString productPath = qt_readRegistryKey(HKEY_LOCAL_MACHINE, compiler_info[i].regKey,
|
||||||
|
KEY_WOW64_32KEY).toLower();
|
||||||
if (productPath.length()) {
|
if (productPath.length()) {
|
||||||
QStringList::iterator it;
|
QStringList::iterator it;
|
||||||
for(it = pathlist.begin(); it != pathlist.end(); ++it) {
|
for(it = pathlist.begin(); it != pathlist.end(); ++it) {
|
||||||
|
@ -74,7 +74,7 @@ static QString keyName(const QString &rKey)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey)
|
QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey, unsigned long options)
|
||||||
{
|
{
|
||||||
QString result;
|
QString result;
|
||||||
|
|
||||||
@ -83,7 +83,8 @@ QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey)
|
|||||||
QString rSubkeyPath = keyPath(rSubkey);
|
QString rSubkeyPath = keyPath(rSubkey);
|
||||||
|
|
||||||
HKEY handle = 0;
|
HKEY handle = 0;
|
||||||
LONG res = RegOpenKeyEx(parentHandle, (wchar_t*)rSubkeyPath.utf16(), 0, KEY_READ, &handle);
|
LONG res = RegOpenKeyEx(parentHandle, (wchar_t*)rSubkeyPath.utf16(), 0,
|
||||||
|
KEY_READ | options, &handle);
|
||||||
|
|
||||||
if (res != ERROR_SUCCESS)
|
if (res != ERROR_SUCCESS)
|
||||||
return QString();
|
return QString();
|
||||||
@ -152,6 +153,7 @@ QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey)
|
|||||||
#else
|
#else
|
||||||
Q_UNUSED(parentHandle);
|
Q_UNUSED(parentHandle);
|
||||||
Q_UNUSED(rSubkey)
|
Q_UNUSED(rSubkey)
|
||||||
|
Q_UNUSED(options);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -63,8 +63,14 @@ QT_BEGIN_NAMESPACE
|
|||||||
* If the key is not found, or the registry cannot be accessed (for example
|
* If the key is not found, or the registry cannot be accessed (for example
|
||||||
* if this code is compiled for a platform other than Windows), a null
|
* if this code is compiled for a platform other than Windows), a null
|
||||||
* string is returned.
|
* string is returned.
|
||||||
|
*
|
||||||
|
* 32-bit code reads from the registry's 32 bit view (Wow6432Node),
|
||||||
|
* 64 bit code reads from the 64 bit view.
|
||||||
|
* Pass KEY_WOW64_32KEY to access the 32 bit view regardless of the
|
||||||
|
* application's architecture, KEY_WOW64_64KEY respectively.
|
||||||
*/
|
*/
|
||||||
QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey);
|
QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey,
|
||||||
|
unsigned long options = 0);
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user