Windows 8 windows 8次要版本返回0而不是2 < >我有C++代码,目的是找到Windows版本: OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; int iRet = OS_UNKNOWN; ZeroMemory ( & osvi, sizeof ( OSVERSIONINFOEX ) ); osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFOEX ); if ( !( bOsVersionInfoEx = GetVersionEx ( ( OSVERSIONINFO * ) & osvi ) ) ) { osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO ); if ( ! GetVersionEx ( ( OSVERSIONINFO * ) & osvi ) ) return OS_UNKNOWN; } //the rest is irrelevant ...

Windows 8 windows 8次要版本返回0而不是2 < >我有C++代码,目的是找到Windows版本: OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; int iRet = OS_UNKNOWN; ZeroMemory ( & osvi, sizeof ( OSVERSIONINFOEX ) ); osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFOEX ); if ( !( bOsVersionInfoEx = GetVersionEx ( ( OSVERSIONINFO * ) & osvi ) ) ) { osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO ); if ( ! GetVersionEx ( ( OSVERSIONINFO * ) & osvi ) ) return OS_UNKNOWN; } //the rest is irrelevant ...,windows-8,windows-installer,custom-action,windowsversion,Windows 8,Windows Installer,Custom Action,Windowsversion,iRet将返回标识Windows版本的内部枚举值。它将根据osvi.dwPlatformId、osvi.dwMajorVersion和osvi.dwMinorVersion中返回的值进行调整 根据MSDN,对于Windows 8,MajorVersion的值是6,MinorVersion的值是2 我在dll中编译了这段代码,如果我从测试EXE程序调用dll,这段代码实际上可以工作 但是,如果我在windows installer包(MSI)中的自定义操作中从同一DLL调用相同的代码,getVer

iRet将返回标识Windows版本的内部枚举值。它将根据osvi.dwPlatformId、osvi.dwMajorVersion和osvi.dwMinorVersion中返回的值进行调整

根据MSDN,对于Windows 8,MajorVersion的值是6,MinorVersion的值是2

我在dll中编译了这段代码,如果我从测试EXE程序调用dll,这段代码实际上可以工作

但是,如果我在windows installer包(MSI)中的自定义操作中从同一DLL调用相同的代码,getVersionX()会为MinorVersion字段返回0

还有其他人经历过这个错误吗?
有人知道如何解决这个问题吗?

事实证明,在Windows 7+上使用GetVersion(Ex)时,Windows Installer在默认情况下对该版本撒谎。答案总是Vista SP0。您可以改为使用VersionNT MSI值


来源:

在Windows 7+上使用GetVersion(Ex)时,Windows Installer在默认情况下与版本有关。答案总是Vista SP0。您可以改为使用VersionNT MSI值


来源:

您可能正在兼容模式下运行。正确。我运行了gpedit.msc并禁用了应用程序兼容性引擎和程序兼容性助手。它开始工作了!您可能正在兼容模式下运行。正确。我运行了gpedit.msc并禁用了应用程序兼容性引擎和程序兼容性助手。它开始工作了!