There's lots of information in the Win32_Process object in the callback to Indicate(). Replace your EventSink::Indicate() with this. It shows how to get a "pointer" to the Win32_Process object and then get its "ExecutablePath" property.
Code:
#include <comutil.h>
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));
HRESULT EventSink::Indicate(long lObjectCount, IWbemClassObject **apObjArray)
{
HRESULT hres = S_OK;
for (int i = 0; i < lObjectCount; i++)
{
cout << "Event occurred" << endl;
IWbemClassObject *pObj = apObjArray[i];
HRESULT hres;
VARIANT vInst_;
hres = pObj->Get(L"TargetInstance", 0, &vInst_, 0, 0);
if (FAILED(hres))
{
cout << "Failed to get TargetInstance: " << hres << endl;
continue;
}//if
try
{
_variant_t vInst;
vInst.Attach(vInst_); // use C++ class to manage VARIANT
IWbemClassObjectPtr pWin32ProcessObj(vInst);
VARIANT vVar;
hres = pWin32ProcessObj->Get(L"ExecutablePath", 0, &vVar, 0, 0);
if (FAILED(hres))
{
cout << "Failed to get ExecutablePath: " << hres << endl;
}//if
else
{
_variant_t vExecPath;
vExecPath.Attach(vVar);
wcout << L"ExecPath: " << (const wchar_t*)((_bstr_t)vExecPath) << endl;
}//else
}//try
catch(_com_error &err)
{
cout << "caught _com_error: " << err.Error() << endl;
}//catch
}//for
return WBEM_S_NO_ERROR;
}//Indicate
gg