我试图读取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;
}
以下是错误的屏幕截图:
注意:有一个原因我没有使用CComPtr&lt;&gt;这里。每当我在头文件 atlcomcli.h 中报告断言失败时。我认为这个错误也可能是由于枚举器对象的nullptr异常引起的。提前致谢
答案 0 :(得分:0)
我自己解决了这个问题。主要问题是设置访问所需的主要权限。这就是枚举返回空指针的原因。要解决此问题,请在调用CoinitiallizeEx后立即编写以下代码:
来自评论的MSDN样本或
此外,作为注释,上述代码不得以任何方式以任何方式运行。这是因为如果使用不当或发生异常,这些指针可能会泄漏内存。宁 的 atlbase.h 强> 和 的 Iwbemdl。 ħ强> 必须添加以使用CComPtr(Com Pointer类)来自动管理构造和销毁。