Visual c++ 如何在VC++中执行此WMI查询?

Visual c++ 如何在VC++中执行此WMI查询?,visual-c++,wmi,Visual C++,Wmi,我最近看到了一个关于检测Windows真实版本的问题 我有一个应用程序,它使用的代码只能在Windows Vista及以上版本上使用。为了保持与Windows XP的兼容性,我创建了自己的版本,它与Vista代码完全相同,但速度远不及Vista代码。当前,当从GetVersionEx检测到XP时,会加载XP代码。但是,很明显,当应用程序在XP兼容性下运行时,会不必要地加载此代码。现在我知道我可以检查Vista方法,但我的代码使用了大量仅限Vista的代码,我不想检查该方法是否存在,因为我已经编写

我最近看到了一个关于检测Windows真实版本的问题

我有一个应用程序,它使用的代码只能在Windows Vista及以上版本上使用。为了保持与Windows XP的兼容性,我创建了自己的版本,它与Vista代码完全相同,但速度远不及Vista代码。当前,当从GetVersionEx检测到XP时,会加载XP代码。但是,很明显,当应用程序在XP兼容性下运行时,会不必要地加载此代码。现在我知道我可以检查Vista方法,但我的代码使用了大量仅限Vista的代码,我不想检查该方法是否存在,因为我已经编写了XP检查,只需更改一个函数就更容易了

现在我的问题是:如何运行此WMI查询并以int和std::string返回Windows版本的结果:从Win32_OperatingSystem选择版本


我使用VC++ 2008。< /P> < P>我不使用C++,但你可以找到样本。

< P>我不使用C++,但是你可以找到样本。

< P>这里有一些代码给你提供基本功能:制作WMI查询和检索版本字符串。

请注意,此示例不需要进行错误检查,而且对于所有这些COM调用,您将需要很多行。有关示例,请参见Uros的链接,以及


下面是一些代码,让您了解基本功能:进行WMI查询并检索版本字符串

请注意,此示例不需要进行错误检查,而且对于所有这些COM调用,您将需要很多行。有关示例,请参见Uros的链接,以及


为什么要告诉程序的其他部分,当操作系统在XP兼容性下运行时,它支持Vista?操作系统尽可能模拟XP,根据您指定的版本更改其行为,不仅针对您的代码,还针对您正在使用的所有基本服务,如Windows Shell、公共控件、基本服务(如文件IO)、安全性、内存管理、DLL加载、,无论是什么样的黑客在WindowsXP中引入,使那些古老的匆忙推出的游戏继续工作。在XP兼容模式下使用Vista API是自找麻烦的。我同意这是一个坏主意,但当时我对最佳实践和一般编程的了解……有点低。我的其他一些问题让我畏缩,质疑我到底在想什么。好消息是我的大多数程序从未离开过我的电脑:为什么你想告诉程序的其他部分,当操作系统在XP兼容下运行时,它支持Vista?操作系统尽可能模拟XP,根据您指定的版本更改其行为,不仅针对您的代码,还针对您正在使用的所有基本服务,如Windows Shell、公共控件、基本服务(如文件IO)、安全性、内存管理、DLL加载、,无论是什么样的黑客在WindowsXP中引入,使那些古老的匆忙推出的游戏继续工作。在XP兼容模式下使用Vista API是自找麻烦的。我同意这是一个坏主意,但当时我对最佳实践和一般编程的了解……有点低。我的其他一些问题让我畏缩,质疑我到底在想什么。好消息是我的大部分程序从未离开过我的电脑:
#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;
}