/*
* WbemObjectSink.h
* Copyright (c) 2012 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
// 2009/01/18 Please define a subclass of this class and customize ShowObject method
// to match your need.
// 2010/04/01 Modified ShowObject method to show an objectText
#pragma once
#define _WIN32_DCOM
#include <sol\Object.h>
#include <wbemidl.h>
#include <comutil.h>
namespace SOL {
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));
class WbemObjectSink : public IWbemObjectSink
{
private:
LONG ref;
public:
/**
* Constructor
*/
WbemObjectSink()
:ref(0) {
AddRef();
}
public:
/**
* virtual Destructor
*/
virtual ~WbemObjectSink() {
Release();
}
public:
virtual ULONG STDMETHODCALLTYPE AddRef() {
return InterlockedIncrement(&ref);
}
public:
virtual ULONG STDMETHODCALLTYPE Release() {
LONG lRef = InterlockedDecrement(&ref);
if(lRef == 0) {
delete this;
}
return lRef;
}
public:
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
REFIID riid, void** ppv) {
HRESULT hr = S_OK;
if (riid == IID_IUnknown || riid == IID_IWbemObjectSink) {
*ppv = (IWbemObjectSink*)this;
AddRef();
hr =WBEM_S_NO_ERROR;
}
else {
hr =E_NOINTERFACE;
}
return hr;
}
public:
/**
* Show properties of IWbemClassObject specified by vTargInst here;
*
* This is really a virtual method.
* You can define a subclass of this to customize this method to match your need.
*/
virtual HRESULT ShowObject(VARIANT& vTargetInst) {
HRESULT hr = WBEM_S_NO_ERROR;
_variant_t vInst(vTargetInst);
IWbemClassObjectPtr pObject(vInst);
BSTR bstr = NULL;
if (SUCCEEDED(hr = pObject->GetObjectText(0, &bstr) )) {
printf("ObjectText=[%S]\n", bstr);
SysFreeString(bstr);
}
return hr;
}
public:
/**
* This is called when an event occurs.
*/
virtual HRESULT STDMETHODCALLTYPE Indicate(
LONG lObjectCount,
IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray) {
for (int i = 0; i < lObjectCount; i++) {
//printf("WbemObjectSink#Indicate,1,Event occurred\n");
HRESULT hr;
VARIANT vTargetInst;
try {
if (SUCCEEDED(hr = apObjArray[i]->Get(L"TargetInstance", 0, &vTargetInst, 0, 0))) {
//Call a virtual function to show properties of the IWbemClassObject of vTargetInst.
ShowObject(vTargetInst);
}
} catch(...) {
printf("WbemObjectSink#Indicate,1,Exception\n");
}
}
return WBEM_S_NO_ERROR;
}
public:
virtual HRESULT STDMETHODCALLTYPE SetStatus(
LONG lFlags,
HRESULT hResult,
BSTR strParam,
IWbemClassObject __RPC_FAR *pObjParam){
if(lFlags == WBEM_STATUS_COMPLETE) {
//printf("Call complete. hResult = 0x%X\n", hResult);
} else if(lFlags == WBEM_STATUS_PROGRESS) {
//printf("Call in progress.\n");
}
return WBEM_S_NO_ERROR;
}
};
}
|