C++ 和 WMI:在 IWbemClassObject::P ut 方法中传递对 CIM 类的引用
C++ and WMI: Pass a reference to a CIM class in the IWbemClassObject::Put method
我正在尝试使用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
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++ 和 WMI:在 IWbemClassObject::P ut 方法中传递对 CIM 类的引用