1

我有 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 ...

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

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

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

但是,如果我从 Windows 安装程序包 (MSI) 中的自定义操作中调用来自相同 DLL 的相同代码,则 GetVersionEx() 会为 MinorVersion 字段返回 0。

有没有其他人遇到过这个错误?有人知道如何解决它吗?

4

1 回答 1

1

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

来源:http: //blogs.msdn.com/b/cjacks/archive/2009/05/06/why-custom-actions-get-a-windows-vista-version-lie-on-windows-7.aspx

于 2015-06-02T17:52:11.627 回答