读取并显示来自变种VT_UNKNOWN的数据

读取并显示来自变种VT_UNKNOWN的数据

问题描述:

我想在每次打开时检索每个进程的信息。我不想仅仅写一个“愚蠢的”循环来循环所有打开的进程,并检查什么时候发生变化,我想做一些更优雅的事情。 我想查询的过程中创建事件,并从这样的事件检索有关进程的信息: 我使用WMI异步查询Win32_Process的情况下,像这样的__InstanceCreationEvent:读取并显示来自变种VT_UNKNOWN的数据

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实例。

任何帮助将不胜感激。

+2

TargetInstance也是IWbemClassObject,这样你就可以齐作IWbemClassObject在您have.http了的IUnknown://stackoverflow.com/questions/28897897/c-monitor -process-creation-and-termination-in-windows –

+0

@SimonMourier谢谢你,这解决了我的问题。我一直在痛苦这个问题太久:) – Daniel

TargetInstance也是IWbemClassObject,因此您可以在IUnknown上为您拥有IWbemClassObject的QI。

这里所以这个答案说明了这一点:C++: Monitor process creation and termination in Windows