c++ - 从变体 VT_UNKNOWN 读取并显示数据

标签 c++ com wmi variant wmi-query

我想在每个进程打开时检索有关它的信息。我不想只是编写一个只遍历所有打开的进程并检查何时发生变化的“愚蠢”循环,而是想做一些更优雅的事情。 我想查询进程的创建事件并从这样的事件中检索有关进程的信息: 我使用 WMI 异步查询 Win32_Process 实例的 __InstanceCreationEvent,如下所示:

hr = pSvc->ExecNotificationQueryAsync(
            _bstr_t("WQL"),
            _bstr_t("SELECT * "
                "FROM __InstanceCreationEvent WITHIN 1 "
                "WHERE TargetInstance ISA 'Win32_Process'"),
            WBEM_FLAG_SEND_STATUS,
            NULL,
            pStubSink);

ExecNotificationQueryAsync 检索事件时,它调用用户实现的 IWbemObjectSink::Indicate 方法并将事件作为 IWbemClassObject 传递给它界面。 (它将指针传递给所有这些事件的数组)。 现在问题来了。我使用 IWbemClassObject::Get 来从 TargetInstance 属性(即 Win32_Process 实例)中获取数据。但是,Get 函数将结果输出到 VARIANT 中。检查结构体的vt成员时,发现包含有效数据的成员是punkVal。 punkVal 的类型是 IUnknown。 基本上我的问题如下: 如何通过 punkVal 获取 Win32_Process 实例? 这是我对 Indicate 方法的实现:

HRESULT EventSink::Indicate(LONG lObjectCount,
IWbemClassObject **apObjArray)
{

    for (int i = 0; i < lObjectCount; i++)
    {
        IWbemClassObject * InstanceCreationEventInterface = apObjArray[i];

        VARIANT v;
        BSTR strClassProp = SysAllocString(L"TargetInstance");
        HRESULT hr;
        hr = InstanceCreationEventInterface->Get(strClassProp, 0, &v, 0, 0);
        SysFreeString(strClassProp);

        if (SUCCEEDED(hr) && (V_VT(&v) == VT_UNKNOWN))
        {
            wcout << (&v)->punkVal << endl; //How do I use punkVal here to get the Win32_Process instance?
        }
        else
        {
            wprintf(L"Error in getting specified object\n");
        }
        VariantClear(&v);
    }

    return WBEM_S_NO_ERROR;
}

因为 punkVal 的类型是 IUnknown*,唯一真正可以用来检索实例的方法是 IUnknown::QueryInterface 但是我真的看不出有什么办法使用此方法获取 Win32_Process 实例。

如有任何帮助,我们将不胜感激。

最佳答案

TargetInstance 也是一个 IWbemClassObject,因此您可以在您拥有的 IUnknown 上对 IWbemClassObject 进行 QI。

SO 上的这个答案证明了这一点:C++: Monitor process creation and termination in Windows

关于c++ - 从变体 VT_UNKNOWN 读取并显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42475375/

相关文章:

c++ - CMake 未启用异常

c# - 什么时候需要在 C# 中通过 COM 查询的接口(interface)上调用 Marshal.ReleaseComObject

c++ - 在非 Microsoft 平台上使用组件对象模型 (COM)

c# - 使用 STA 和 COM 的 VSTO 后台线程

c# - wmi 无效查询错误

powershell - 日期转换 yyyymmddhhmm+000

c++ - 删除 vector 中的指针时出错

c++ - 输入包含前导零

c++ - C++ 中的结构是否类似于枚举或类?

c# - 如何通过WMI从 'Win32_ProcessStopTrace'类获取附加信息?