IEnumWbemClassObject在C ++中返回null

时间:2018-01-07 06:53:08

标签: c++ com

我试图读取Win32_PhysicalMemoryArray类的Creation Class Name属性,但是在运行下面的代码时,名为enumerator的IEnumWbemClass对象返回null。我无法弄清楚问题。如果有人能帮助我,我将非常感激。

这是我的代码:

#include "stdafx.h"
using namespace std;

int main()
{


    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    IWbemLocator *locator;
    hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast< void ** >( &locator ));
    IWbemServices * service;
    hr=locator->ConnectServer((BSTR)L"root\\cimv2", NULL, NULL, NULL, WBEM_FLAG_CONNECT_USE_MAX_WAIT, NULL, NULL, &service);
    IEnumWbemClassObject * enumerator;
    hr = service->ExecQuery((BSTR)L"WQL", (BSTR)L"SELECT * FROM Win32_PhysicalMemoryArray", WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator);
    ULONG retcnt;
    IWbemClassObject * memdevice;
    hr = enumerator->Next(WBEM_INFINITE, 1L, &memdevice, &retcnt);
    variant_t var_val;
    hr = memdevice->Get(L"CreationClassName", 0, &var_val, NULL, NULL);
    cout << var_val.bstrVal;

    CoUninitialize( );
    return 0;
}

以下是错误的屏幕截图:

nullptr Exception

注意:有一个原因我没有使用CComPtr&lt;&gt;这里。每当我在头文件 atlcomcli.h 中报告断言失败时。我认为这个错误也可能是由于枚举器对象的nullptr异常引起的。提前致谢

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。主要问题是设置访问所需的主要权限。这就是枚举返回空指针的原因。要解决此问题,请在调用CoinitiallizeEx后立即编写以下代码:

来自评论的MSDN样本或

Making WMI Queries in C++

此外,作为注释,上述代码不得以任何方式以任何方式运行。这是因为如果使用不当或发生异常,这些指针可能会泄漏内存。宁 的 atlbase.h 和 的 Iwbemdl。 ħ 必须添加以使用CComPtr(Com Pointer类)来自动管理构造和销毁。