读取并显示来自变种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实例。
任何帮助将不胜感激。
TargetInstance也是IWbemClassObject,因此您可以在IUnknown上为您拥有IWbemClassObject的QI。
这里所以这个答案说明了这一点:C++: Monitor process creation and termination in Windows
TargetInstance也是IWbemClassObject,这样你就可以齐作IWbemClassObject在您have.http了的IUnknown://stackoverflow.com/questions/28897897/c-monitor -process-creation-and-termination-in-windows –
@SimonMourier谢谢你,这解决了我的问题。我一直在痛苦这个问题太久:) – Daniel