【发布时间】: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;
}
这是错误的截图:
注意:我没有在这里使用 CComPtr 是有原因的。每当我在头文件 atlcomcli.h 中报告断言失败时。我认为这个错误也可能是由于枚举器对象的 nullptr 异常。提前致谢
【问题讨论】:
-
查看
service->ExecQuery的返回码。 -
我运行了这段代码,返回的错误是权限不足的变种,尝试运行提升的代码。
-
错误检查不是可选的,您必须使用 FAILED(hr) 进行验证。也是了解此代码失败原因的唯一方法,hr 包含错误代码。将字符串文字转换为 (BSTR) 是不正确的,需要 SysAllocString() 或智能指针类型。使用MSDN sample code
-
问题已解决。我检查了返回码 Phil 是对的。问题是由于 Soronel 提到的较少优先权。 Hans 的代码很有帮助。它解决了我的问题。多谢你们。很高兴有你们这样的开发者