2010-01-04 53 views
0

我最近看到this Stackoverflow有关检测Windows“真实”版本的问题。如何在VC++中执行此WMI查询?

我有一个应用程序使用仅在Windows Vista和更高版本上可用的代码。为了保持与Windows XP的兼容性,我创建了自己的版本,与Vista代码完全一样,但远不及Vista代码。目前,当从GetVersionEx()检测到XP时,加载XP代码。但是,显然,当应用程序在XP兼容性下运行时,会不必要地加载此代码。现在我知道我可以检查Vista方法,但是我的代码使用了很多仅限Vista的代码,并且我宁愿不必检查方法是否存在,因为我已经编写了XP检查,只需更改它就会更容易一个功能。

现在我的问题:怎样才能运行此WMI查询并返回结果(Windows版)为int和std ::字符串:“从Win32_OperatingSystem选择版本”

我使用VC++ 2008

+1

你为什么要告诉你的程序的其他部分的OS当它在XP兼容运行为Vista-capable?操作系统尽可能地模拟XP,根据您指定的版本更改其行为,不仅适用于您的代码,还适用于您所使用的所有基本服务,如Windows Shell,常用控制,基本服务(如文件IO),安全性,内存管理,DLL加载以及Windows XP中引入的任何黑客技术,以使这些古老的冲出式游戏继续发挥作用)。在XP兼容模式下使用Vista API需要麻烦。 – 2014-01-07 00:24:19

+0

我同意这是一个糟糕的主意,但是当时我对最佳实践的了解和诚实的一般编程是......有点低。我的其他一些问题让我感到畏惧,并质疑我在想什么。好消息是我的大部分程序都没有离开我的电脑:) – Kryten 2014-01-08 05:00:25

回答

3

下面是一些代码,可让您获得基本功能:制作WMI查询和检索Version字符串。

请注意,此示例不会打扰错误检查 - 并且使用所有这些COM调用,您将需要很多行。例子可见乌罗什链接,也Example: Getting WMI Data from the Local Computer

#include <string> 
#include <atlbase.h> // For ATL autorelease classes (CComBSTR, CComPtr) 
#include <wbemidl.h> // 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<IWbemLocator> pWbemLocator; 
    hr = pWbemLocator.CoCreateInstance(CLSID_WbemLocator); 

    CComPtr<IWbemServices> pWbemServices; 
    hr = pWbemLocator->ConnectServer(CComBSTR(L"root\\cimv2"), NULL, NULL, 0, NULL, 0, NULL, &pWbemServices); 

    CComPtr<IEnumWbemClassObject> 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<IWbemClassObject> 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; 
} 
0

我不使用C++,但可以找到示例here