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

时间:2010-01-04 14:16:52

标签: visual-c++ wmi

我最近看到了this Stackoverflow关于检测Windows“真实”版本的问题。

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

现在我的问题:如何运行此WMI查询并将结果(Windows版本)作为int AND std :: string返回:“从Win32_OperatingSystem中选择版本”

我正在使用VC ++ 2008。

2 个答案:

答案 0 :(得分:5)

这里有一些代码可以帮助您获得基本功能:进行WMI查询并检索版本字符串。

请注意,此示例不会打扰错误检查 - 对于所有这些COM调用,您将需要多行。有关示例,请参阅Uros的链接,以及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;
}

答案 1 :(得分:0)

我不使用C ++,但你可以找到样本here