【问题标题】:C++ and WMI: Pass a reference to a CIM class in the IWbemClassObject::Put methodC++ 和 WMI:在 IWbemClassObject::Put 方法中传递对 CIM 类的引用
【发布时间】:2019-12-26 20:05:57
【问题描述】:

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

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

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

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

这很好用。但是,我找不到任何关于传递 CIM 类实例的文档。 IWbemClassObject::Put 上的文档说明:

如果 pVal 要包含嵌入的 IWbemClassObject,则调用者必须为 IID_IUnknown 调用 IWbemClassObject::QueryInterface,并使用 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);

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

亲切的问候!

【问题讨论】:

  • 你有没有让这个工作?我有同样的问题。谢谢!

标签: c++ wmi


【解决方案1】:

如果您的实例已经存储在 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

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多