我最近看到此有关检测的Windows的“真实”的版本问题#1。
我有一个使用仅在Windows Vista及更高版本上可用的代码的应用程序。为了保持与Windows XP的兼容性,我创建了自己的版本,该版本与Vista代码完全相同,但与Vista代码的速度相差无几。当前,当从GetVersionEx()中检测到XP时,将加载XP代码。但是,显然,当应用程序在XP兼容性下运行时,此代码会不必要地加载。现在我知道我可以检查Vista方法,但是我的代码使用了很多仅Vista的代码,我宁愿不必检查该方法是否存在,因为我已经编写了XP检查,并且更改起来会更容易一个功能。
现在我的问题是:如何运行此WMI查询并以int AND std :: string形式返回结果(Windows版本):“从Win32_OperatingSystem中选择版本”
我正在使用VC ++ 2008。
这是一些获得基本功能的代码:进行WMI查询并检索Version字符串。
请注意,此示例不会为错误检查带来麻烦-并且通过所有这些COM调用,您将需要很多行。有关示例,请参见Uros的链接,以及示例:从本地计算机获取WMI数据
#include#include // For ATL autorelease classes (CComBSTR, CComPtr) #include // For WMI #pragma comment(lib, "wbemuuid.lib") // Link to WMI library. (Can do in library includes instead) std::string GetOsVersionString() { HRESULT hr = ::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); CComPtr pWbemLocator; hr = pWbemLocator.CoCreateInstance(CLSID_WbemLocator); CComPtr pWbemServices; hr = pWbemLocator->ConnectServer(CComBSTR(L"root\\cimv2"), NULL, NULL, 0, NULL, 0, NULL, &pWbemServices); CComPtr pEnum; CComBSTR cbsQuery = L"Select Version from Win32_OperatingSystem"; hr = pWbemServices->ExecQuery(CComBSTR("WQL"), cbsQuery, WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum); ULONG uObjectCount = 0; CComPtr pWmiObject; hr = pEnum->Next(WBEM_INFINITE, 1, &pWmiObject, &uObjectCount); CComVariant cvtVersion; hr = pWmiObject->Get(L"Version", 0, &cvtVersion, 0, 0); std::string sOsVersion = CW2A(cvtVersion.bstrVal); return sOsVersion; } int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); std::string sOsVersion = GetOsVersionString(); ::CoUninitialize(); return 0; }