C++ 和 WMI:在 IWbemClassObject::P ut 方法中传递对 CIM 类的引用

C++ and WMI: Pass a reference to a CIM class in the IWbemClassObject::Put method

本文关键字:CIM 引用 方法 WMI IWbemClassObject ut C++      更新时间:2023-10-16

我正在尝试使用C++调用某个WMI方法:Msvm_VirtualSystemManagementService::GetVirtualSystemThumbnailImage (https://learn.microsoft.com/en-us/previous-versions/windows/desktop/virtual/getvirtualsystemthumbnailimage-msvm-virtualsystemmanagementservice(。

该方法本身需要三个参数:对 CIM_VirtualSystemSettingData 实例的引用和两个 uint16。

在C++中,调用 WMI 方法首先需要通过 IWbemClassObject::GetMethod 和 SpawnInstance 获取方法的参数;此时,您可以开始使用 IWbemClassObject::P ut 方法开始填写参数,即:

CComVariant varCommand2;
varCommand2.vt = VT_BSTR;
varCommand2.bstrVal = _bstr_t("32");
hres = pClassInstance->Put(L"WidthPixels", 0, &varCommand2, CIM_UINT16);

这工作正常。但是,我找不到有关传递 CIM 类实例的任何文档。关于IWbemClassObject::P ut的文档指出:

如果 pVal 要包含嵌入的 IWbemClassObject,则调用方必须调用 IWbemClassObject::QueryInterface for IID_IUnknown,并使用 VT_UNKNOWN 类型将生成的指针放在 VARIANT 中。

因此,这就是我要做的:

CComVariant varCommand;
varCommand.vt = VT_UNKNOWN;
vVirtualSystemSettingData[0].getClassInstance()->QueryInterface(IID_IUnknown, (void**)&varCommand); //getClassInstance returns a reference to the CComPtr that contains the VirtualSystemSettingData I want to use
hres = pClassInstance->Put(L"TargetSystem", 0, &varCommand, 0);

不幸的是,我只是得到了一个不匹配的错误,所以我知道我没有正确执行此操作。因此,有谁知道如何将 CIM 对象的引用传递给 IWbemClassObject::P ut 方法?

亲切问候!

如果您的实例已经存储在 wmi 存储库中,您可以使用他的路径来创建引用。

例如:

VARIANT v;
VariantInit(&v);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(L"{SOME_CLASS}.Name="{YOUR_INSTNACE_NAME}"");
hres = pClassInstance->Put(L"TargetSystem", 0, &v, CIM_REFERENCE);
VariantClear(&v);

从另一个命名空间访问实例将如下所示:

SysAllocString(L"\\.\root\{SOME_NAMESPACE}:{SOME_CLASS}.Name="{YOUR_INSTACE_NAME}"")

还有一些完整的代码示例: https://github.com/spmana/WMIWrapper/tree/master