Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

866 lines
27 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
SVCQ.H
Abstract:
Declarations for asynchronous request queue classes.
Classes defined:
CAsyncReq and derivatives Asynchrnous requests to WINMGMT.
CAsyncServiceQueue The queue of such requests.
History:
a-raymcc 16-Jul-96 Created.
a-levn 12-Sep-96 Implemented a few requests.
Added LoadProviders
--*/
#ifndef _ASYNC_Q_H_
#define _ASYNC_Q_H_
class CWbemNamespace;
class CBasicObjectSink;
class CStdSink;
class CWbemObject;
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq
//
// Represents an asynchrnous request to WINMGMT, such as GetObjectAsync.
// This class is derived from CExecRequest (execq.h), a generic request for
// execution queues. For more information on queues and requests, see execq.h
//
//******************************************************************************
//
// Contructor
//
// Every asynchrnous request has an IWbemObjectSink pointer associated with it.
// In addition, assigns a unique integer to this object which becomes its
// request handle.
//
// PARAMETERS:
//
// IWbemObjectSink* pHandler The handler associated with this request.
// AddRefs and stores this pointer.
//
//******************************************************************************
//
// Destructor
//
// Releases the stored handler.
//
//******************************************************************************
//
// GetRequestHandle
//
// Returns the unique request handle assigned to this request in constructor.
//
// RETURN VALUES:
//
// long
//
//******************************************************************************
class CAsyncReq : public CWbemRequest
{
protected:
CStdSink *m_pHandler;
long m_lRequestHandle;
void SetRequestHandle(long lHandle) {m_lRequestHandle = lHandle;}
void SetNoAuthentication(IWbemObjectSink* pHandler);
public:
CAsyncReq(IWbemObjectSink* pHandler, IWbemContext* pContext,
bool bSeparatelyThreaded = false);
virtual ~CAsyncReq();
virtual HRESULT Execute() = 0;
virtual CWbemQueue* GetQueue();
virtual BOOL IsInternal() {return TRUE;}
void TerminateRequest(HRESULT hRes);
HRESULT SetTaskHandle(_IWmiCoreHandle *phTask);
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncServiceQueue
//
// This class represents the queue of asynchrnous requests into WINMGMT (every
// request into WINMGMT becomes asynchronous, since synchronous methods call
// asynchrnous ones and wait). There is almost no additional functionality
// here, see CExecQueue in execq.h for all details
//
//******************************************************************************
//
// Constructor
//
// In addition to normal CExecQueue construction, launches the processing
// thread by calling Run.
//
//******************************************************************************
class CAsyncServiceQueue : public CWbemQueue
{
private:
BOOL m_bInit;
public:
CAsyncServiceQueue(_IWmiArbitrator * pArb);
HRESULT InitializeThread();
void UninitializeThread();
void IncThreadLimit();
void DecThreadLimit();
BOOL IsInit(){ return m_bInit; };
};
//******************************************************************************
//******************************************************************************
//
// class CNamespaceReq
//
// Another abstract class, albeit derived from CAsyncReq. This one is for
// asynchrnous requests to a particular namespace.
//
//******************************************************************************
//
// Constructor.
//
// In addition to the CAsyncReq's IWbemObjectSink*, takes the
// namespace pointer against which the request is to be executed. Most of
// the time, the execute function calls one of Exec_... members of
// CWbemNamespace.
//
//******************************************************************************
class CNamespaceReq : public CAsyncReq
{
protected:
CWbemNamespace* m_pNamespace;
public:
CNamespaceReq(CWbemNamespace* pNamespace, IWbemObjectSink* pHandler,
IWbemContext* pContext, bool bSeparatelyThreaded = false);
virtual ~CNamespaceReq();
virtual HRESULT Execute() = 0;
static WCHAR s_DumpBuffer[128];
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_DeleteClassAsync
//
// Encapsulates a request to execute DeleteClassAsync against a particular
// namespace. Does it by calling Exec_DeleteClass and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN LPWSTR wszClass The class to delete.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_DeleteClassAsync : public CNamespaceReq
{
WString m_wsClass;
LONG m_lFlags;
public:
CAsyncReq_DeleteClassAsync(
ADDREF CWbemNamespace *pNamespace,
READONLY LPWSTR wszClass,
LONG lFlags,
ADDREF IWbemObjectSink *pHandler,
IWbemContext* pContext
) : CNamespaceReq(pNamespace, pHandler, pContext),
m_wsClass(wszClass), m_lFlags(lFlags)
{}
HRESULT Execute();
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsClass; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_DeleteInstanceAsync
//
// Encapsulates a request to execute DeleteInstanceAsync against a particular
// namespace. Does it by calling Exec_DeleteInstance and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN LPWSTR wszObjectPath The path to the instance to delete.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_DeleteInstanceAsync : public CNamespaceReq
{
WString m_wsPath;
LONG m_lFlags;
public:
CAsyncReq_DeleteInstanceAsync(
ADDREF CWbemNamespace *pNamespace,
READONLY LPWSTR wszPath,
LONG lFlags,
ADDREF IWbemObjectSink *pHandler,
IWbemContext* pContext
) : CNamespaceReq(pNamespace, pHandler, pContext), m_wsPath(wszPath),
m_lFlags(lFlags)
{}
HRESULT Execute();
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsPath; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_PutClassAsync
//
// Encapsulates a request to execute PutClassAsync against a particular
// namespace. Does it by calling Exec_PutClass and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN IWbemClassObject* pClass The class to put.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_PutClassAsync : public CNamespaceReq
{
IWbemClassObject* m_pClass;
LONG m_lFlags;
public:
CAsyncReq_PutClassAsync(
ADDREF CWbemNamespace *pNamespace,
ADDREF IWbemClassObject* pClass,
LONG lFlags,
ADDREF IWbemObjectSink *pHandler,
ADDREF IWbemContext* pContext
) : CNamespaceReq(pNamespace, pHandler, pContext), m_pClass(pClass),
m_lFlags(lFlags)
{
m_pClass->AddRef();
}
~CAsyncReq_PutClassAsync()
{
m_pClass->Release();
}
HRESULT Execute();
void DumpError();
LPCWSTR GetReqInfo()
{
_variant_t varClass;
if (FAILED(m_pClass->Get(L"__CLASS",0,&varClass,0,0))) return L"";
if (VT_BSTR == V_VT(&varClass))
{
StringCchCopyW(CNamespaceReq::s_DumpBuffer,LENGTH_OF(CNamespaceReq::s_DumpBuffer)-1,V_BSTR(&varClass));
return CNamespaceReq::s_DumpBuffer;
}
else return L"";
};
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_PutInstanceAsync
//
// Encapsulates a request to execute PutInstanceAsync against a particular
// namespace. Does it by calling Exec_PutInstance and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN IWbemClassObject* pInstance The instance to put.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_PutInstanceAsync : public CNamespaceReq
{
IWbemClassObject* m_pInstance;
LONG m_lFlags;
public:
CAsyncReq_PutInstanceAsync(
ADDREF CWbemNamespace *pNamespace,
ADDREF IWbemClassObject* pInstance,
LONG lFlags,
ADDREF IWbemObjectSink *pHandler,
ADDREF IWbemContext* pContext
) : CNamespaceReq(pNamespace, pHandler, pContext),
m_pInstance(pInstance), m_lFlags(lFlags)
{
m_pInstance->AddRef();
}
~CAsyncReq_PutInstanceAsync()
{
m_pInstance->Release();
}
HRESULT Execute();
void DumpError();
LPCWSTR GetReqInfo()
{
_variant_t varRelPath;
if (FAILED(m_pInstance->Get(L"__RELPATH",0,&varRelPath,0,0))) return L"";
if (VT_BSTR == V_VT(&varRelPath))
{
StringCchCopyW(CNamespaceReq::s_DumpBuffer,LENGTH_OF(CNamespaceReq::s_DumpBuffer)-1,V_BSTR(&varRelPath));
return CNamespaceReq::s_DumpBuffer;
}
else return L"";
};
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_CreateClassEnumAsync
//
// Encapsulates a request to execute CreateClassEnumAsync against a particular
// namespace. Does it by calling Exec_CreateClassEnum and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN BSTR Parent The name of the parent class. If NULL,
// start at the top level.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_CreateClassEnumAsync : public CNamespaceReq
{
WString m_wsParent;
LONG m_lFlags;
public:
CAsyncReq_CreateClassEnumAsync(CWbemNamespace* pNamespace,
BSTR Parent, LONG lFlags, ADDREF IWbemObjectSink* pHandler,
ADDREF IWbemContext* pContext
) : CNamespaceReq(pNamespace, pHandler, pContext), m_wsParent(Parent),
m_lFlags(lFlags)
{}
HRESULT Execute();
virtual BOOL IsLongRunning() {return TRUE;}
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsParent; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_CreateInstanceEnumAsync
//
// Encapsulates a request to execute CreateInstanceEnumAsync against a
// particular
// namespace. Does it by calling Exec_CreateInstanceEnum and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN BSTR Class The name of the class.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_CreateInstanceEnumAsync : public CNamespaceReq
{
WString m_wsClass;
LONG m_lFlags;
public:
CAsyncReq_CreateInstanceEnumAsync(
CWbemNamespace* pNamespace, BSTR Class, LONG lFlags,
ADDREF IWbemObjectSink *pHandler,
ADDREF IWbemContext* pContext)
: CNamespaceReq(pNamespace, pHandler, pContext), m_wsClass(Class),
m_lFlags(lFlags)
{}
HRESULT Execute();
virtual BOOL IsLongRunning() {return TRUE;}
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsClass; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_GetObjectByPathAsync
//
// Encapsulates a request to execute GetObjectAsync against a
// particular
// namespace. Does it by calling Exec_GetObjectByPath and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN BSTR ObjectPath The path to the object to get.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_GetObjectAsync : public CNamespaceReq
{
WString m_wsObjectPath;
long m_lFlags;
public:
CAsyncReq_GetObjectAsync(
CWbemNamespace* pNamespace, BSTR ObjectPath, long lFlags,
ADDREF IWbemObjectSink *pHandler, ADDREF IWbemContext* pContext) :
CNamespaceReq(pNamespace, pHandler, pContext),
m_wsObjectPath(ObjectPath), m_lFlags(lFlags)
{}
HRESULT Execute();
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsObjectPath; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_ExecMethodAsync
//
// Encapsulates a request to execute ExecMethodAsync against a
// particular
// namespace. Does it by calling Exec_ExecMethodAsync and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN BSTR ObjectPath The path to the object to get.
// IN BSTR MethodName The name of the method
// IN LONG lFlags Flags
// IN IWbemClassObject* pInParams The in-parameter of the method
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_ExecMethodAsync : public CNamespaceReq
{
WString m_wsObjectPath;
WString m_wsMethodName;
IWbemClassObject* m_pInParams;
long m_lFlags;
public:
CAsyncReq_ExecMethodAsync(
CWbemNamespace* pNamespace,
BSTR ObjectPath,
BSTR MethodName,
long lFlags,
IWbemClassObject* pInParams,
ADDREF IWbemObjectSink *pHandler,
ADDREF IWbemContext* pContext)
: CNamespaceReq(pNamespace, pHandler, pContext),
m_wsObjectPath(ObjectPath), m_wsMethodName(MethodName),
m_pInParams(pInParams), m_lFlags(lFlags)
{
if(m_pInParams)
m_pInParams->AddRef();
}
~CAsyncReq_ExecMethodAsync()
{
if(m_pInParams)
m_pInParams->Release();
}
HRESULT Execute();
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsMethodName; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_ExecQueryAsync
//
// Encapsulates a request to execute ExecQueryAsync against a
// particular
// namespace. Does it by calling CQueryEngine::ExecQuery and converting the
// results to the asynchrnous format.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN BSTR QueryFormat The query language
// IN BSTR Query The query string.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_ExecQueryAsync : public CNamespaceReq
{
WString m_wsQueryFormat;
WString m_wsQuery;
long m_lFlags;
public:
CAsyncReq_ExecQueryAsync(CWbemNamespace* pNamespace,
BSTR QueryFormat, BSTR Query, long lFlags,
IWbemObjectSink *pHandler, IWbemContext* pContext) :
CNamespaceReq(pNamespace, pHandler, pContext),
m_wsQueryFormat(QueryFormat), m_wsQuery(Query), m_lFlags(lFlags)
{}
HRESULT Execute();
virtual BOOL IsLongRunning() {return TRUE;}
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsQuery; };
};
//******************************************************************************
//
//******************************************************************************
//
class CCallResult;
class CAsyncReq_OpenNamespace : public CAsyncReq
{
CWbemNamespace* m_pParentNs;
WString m_wsNamespace;
long m_lSecurityFlags;
DWORD m_dwPermission;
CCallResult* m_pResult;
bool m_bForClient;
public:
CAsyncReq_OpenNamespace(CWbemNamespace* pParentNs, LPWSTR wszNamespace,
long lSecurityFlags, DWORD dwPermission,
IWbemContext* pContext, CCallResult* pResult, bool bForClient);
~CAsyncReq_OpenNamespace();
HRESULT Execute();
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsNamespace; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_ExecNotificationQueryAsync
//
// Encapsulates a request to execute ExecNotificationQueryAsync against a
// particular
// namespace. Does it by calling ESS RegisterNotificationSink.
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
// IN CWbemNamespace* pNamespace The namespace to execute against.
// IN BSTR QueryFormat The query language
// IN BSTR Query The query string.
// IN LONG lFlags Flags
// IN IWbemObjectSink* pHandler The handler to put results in.
//
//******************************************************************************
class CAsyncReq_ExecNotificationQueryAsync : public CNamespaceReq
{
WString m_wsQueryFormat;
WString m_wsQuery;
long m_lFlags;
HRESULT *m_phRes;
IWbemEventSubsystem_m4* m_pEss;
HANDLE m_hEssDoneEvent;
public:
CAsyncReq_ExecNotificationQueryAsync(CWbemNamespace* pNamespace,
IWbemEventSubsystem_m4* pEss,
BSTR QueryFormat, BSTR Query, long lFlags,
IWbemObjectSink *pHandler, IWbemContext* pContext, HRESULT* phRes,
HANDLE hEssApprovalEvent
);
~CAsyncReq_ExecNotificationQueryAsync();
HRESULT Execute();
virtual BOOL IsLongRunning() {return TRUE;}
void DumpError();
LPCWSTR GetReqInfo(){ return (WCHAR *)m_wsQuery; };
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_CancelAsyncCall
//
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
//
//******************************************************************************
class CAsyncReq_CancelAsyncCall : public CAsyncReq
{
protected:
HRESULT* m_phres;
IWbemObjectSink* m_pSink;
public:
CAsyncReq_CancelAsyncCall(IWbemObjectSink* pSink, HRESULT* phres);
~CAsyncReq_CancelAsyncCall();
HRESULT Execute();
void DumpError(){ DEBUGTRACE((LOG_WBEMCORE,
"CAsyncReq_CancelAsyncCall call failed\n"));};
LPCWSTR GetReqInfo()
{
StringCchPrintfW(CNamespaceReq::s_DumpBuffer,LENGTH_OF(CNamespaceReq::s_DumpBuffer)-1,L"CancelAsyncCall for sink %p",m_pSink);
return CNamespaceReq::s_DumpBuffer;
};
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_CancelProvAsyncCall
//
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
//
//******************************************************************************
class CAsyncReq_CancelProvAsyncCall : public CAsyncReq
{
protected:
IWbemServices* m_pProv;
IWbemObjectSink* m_pSink;
IWbemObjectSink* m_pStatusSink;
public:
CAsyncReq_CancelProvAsyncCall( IWbemServices* pProv, IWbemObjectSink* pSink,
IWbemObjectSink* pStatusSink );
~CAsyncReq_CancelProvAsyncCall();
HRESULT Execute();
void DumpError(){ DEBUGTRACE((LOG_WBEMCORE,
"CAsyncReq_CancelProvAsyncCall call failed\n"));};
LPCWSTR GetReqInfo()
{
StringCchPrintfW(CNamespaceReq::s_DumpBuffer,LENGTH_OF(CNamespaceReq::s_DumpBuffer)-1,L"CancelProvAsyncCall for sink %p",m_pProv);
return CNamespaceReq::s_DumpBuffer;
};
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_DynAux_GetInstances
//
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
//
// READONLY CWbemObject *pClassDef,
// long lFlags,
// IWbemContext* pCtx,
// CBasicObjectSink* pSink
//
//******************************************************************************
class CAsyncReq_DynAux_GetInstances : public CNamespaceReq
{
private:
CWbemObject *m_pClassDef ;
IWbemContext *m_pCtx ;
long m_lFlags ;
CBasicObjectSink *m_pSink ;
public:
CAsyncReq_DynAux_GetInstances (
CWbemNamespace *pNamespace ,
CWbemObject *pClassDef ,
long lFlags ,
IWbemContext *pCtx ,
CBasicObjectSink *pSink);
~CAsyncReq_DynAux_GetInstances();
HRESULT Execute ();
virtual BOOL IsLongRunning() {return TRUE;}
void DumpError();
LPCWSTR GetReqInfo()
{
_variant_t varClass;
if (FAILED(m_pClassDef->Get(L"__CLASS",0,&varClass,0,0))) return L"";
if (VT_BSTR == V_VT(&varClass))
{
StringCchCopyW(CNamespaceReq::s_DumpBuffer,LENGTH_OF(CNamespaceReq::s_DumpBuffer)-1,V_BSTR(&varClass));
return CNamespaceReq::s_DumpBuffer;
}
else return L"";
};
};
//******************************************************************************
//******************************************************************************
//
// class CAsyncReq_DynAux_ExecQueryAsync
//
//
//******************************************************************************
//
// Constructor.
//
// PARAMETERS:
//
//
// CWbemNamespace *pNamespace ,
// CWbemObject *pClassDef ,
// LPWSTR Query,
// LPWSTR QueryFormat,
// long lFlags ,
// IWbemContext *pCtx ,
// CBasicObjectSink *pSink
//
//******************************************************************************
class CAsyncReq_DynAux_ExecQueryAsync : public CNamespaceReq
{
private:
CWbemObject *m_pClassDef ;
LPWSTR m_Query ;
LPWSTR m_QueryFormat ;
IWbemContext *m_pCtx ;
long m_lFlags ;
CBasicObjectSink *m_pSink ;
HRESULT m_Result ;
public:
CAsyncReq_DynAux_ExecQueryAsync (CWbemNamespace *pNamespace ,
CWbemObject *pClassDef ,
LPWSTR Query,
LPWSTR QueryFormat,
long lFlags ,
IWbemContext *pCtx ,
CBasicObjectSink *pSink);
~CAsyncReq_DynAux_ExecQueryAsync();
HRESULT Initialize ()
{
return m_Result ;
}
HRESULT Execute ();
virtual BOOL IsLongRunning() {return TRUE;}
void DumpError();
LPCWSTR GetReqInfo()
{
return (WCHAR * )m_Query;
};
};
class CAsyncReq_RemoveNotifySink : public CAsyncReq
{
private:
IWbemObjectSink * m_pSink;
IWbemObjectSink* m_pStatusSink;
public:
CAsyncReq_RemoveNotifySink(IWbemObjectSink* pSink, IWbemObjectSink* pStatusSink);
~CAsyncReq_RemoveNotifySink();
HRESULT Execute();
void DumpError(){};
LPCWSTR GetReqInfo()
{
StringCchPrintfW(CNamespaceReq::s_DumpBuffer,LENGTH_OF(CNamespaceReq::s_DumpBuffer)-1,L"RemoveNotifySink for sink %p",m_pSink);
return CNamespaceReq::s_DumpBuffer;
};
void SetStatusSink(IWbemObjectSink * pStatusSink)
{
if (m_pStatusSink) m_pStatusSink->Release();
m_pStatusSink = pStatusSink;
if (m_pStatusSink) m_pStatusSink->AddRef();
}
void SetSink(IWbemObjectSink * pSink)
{
if (m_pSink) m_pSink->Release();
m_pSink = pSink;
if (m_pSink) m_pSink->AddRef();
}
};
#endif