【问题标题】:IEnumWbemClassObject returning null in C++IEnumWbemClassObject 在 C++ 中返回 null
【发布时间】:2018-01-07 06:53:08
【问题描述】:

我试图读取 Win32_PhysicalMemoryArray 类的创建类名称属性,但在运行名为 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 中报告断言失败时。我认为这个错误也可能是由于枚举器对象的 nullptr 异常。提前致谢

【问题讨论】:

  • 查看service-&gt;ExecQuery的返回码。
  • 我运行了这段代码,返回的错误是权限不足的变种,尝试运行提升的代码。
  • 错误检查不是可选的,您必须使用 FAILED(hr) 进行验证。也是了解此代码失败原因的唯一方法,hr 包含错误代码。将字符串文字转换为 (BSTR) 是不正确的,需要 SysAllocString() 或智能指针类型。使用MSDN sample code
  • 问题已解决。我检查了返回码 Phil 是对的。问题是由于 Soronel 提到的较少优先权。 Hans 的代码很有帮助。它解决了我的问题。多谢你们。很高兴有你们这样的开发者

标签: c++ com


【解决方案1】:

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

来自 cmets 的 MSDN 示例或

Making WMI Queries in C++

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

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多