



OSVERSIONINFO>(&info)));wcout << L"Version: " << info.dwMajorVersion <<L"." << info.dwMinorVersion <<L"." << info.dwBuildNumber << L" Service Pack " << info.wServicePackMajor << "." << info.wServicePackMinor << std::endl;DWORD type = 0;VERIFY(::GetProductInfo(info.dwMajorVersion, info.dwMinorVersion, info.wServicePackMajor, info.wServicePackMinor, &type));switch (type){ case PRODUCT_UNLICENSED: { wcout << L"The software license is invalid or expired." << std::endl; break; } case PRODUCT_DATACENTER_SERVER_CORE: case PRODUCT_STANDARD_SERVER_CORE: case PRODUCT_ENTERPRISE_SERVER_CORE: { wcout << L"This is Windows Server Core." << std::endl; break; } default: { wcout << L"This is probably not Windows Server Core..." << std::endl; }};你应该可以发现,上面的代码中存在着一个问题。产品类型列表可能会随着新版本Windows的推出而不停增长。当前只有三个版本的Server Core,但今后很可能会越变越多。幸运的是,微软公司替我们考虑到了这一点。技巧在于调用GetProductInfo 时,你必须只指定程序运行于的最新版本的Windows版本。这样即可保证实际的产品类型被正确映射到你所指定的版本上。设想十年以后,在Windows 2016(原文发表于2006年——译者注),微软公司引入了一个新的产品类型,名为PRODUCT_EXTRA_CRISPY_ENTERPRISE_SERVER_CORE(含义为“超级无敌清爽版Server Core”——译者注)。如果你将GetProductInfo 基于6.0版本和0.0service pack 硬编码到了程序中,那么程序就会自动映射到最接近的版本上。在这个例子中,十有八九会是PRODUCT_ENTERPRISE_SERVER_CORE。基于这些信息,我们可以将上面的这段示例代码重构为如下样子:| 欢迎光临 幽游生活 (http://www.yylive.net/) | Powered by Discuz! 7.2 |