IEnumWbemClassObject在C ++中返回null

问题描述 投票:0回答:1

我试图读取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 <>。每当我包括在头文件atlcomcli.h中报告断言falure时。我认为这个错误也可能是由于枚举器对象的nullptr异常引起的。提前致谢

c++ com
1个回答
0
投票

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

来自评论的MSDN样本或

Making WMI Queries in C++

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

© www.soinside.com 2019 - 2024. All rights reserved.