📄 myfilter.cpp
字号:
// MyFilter.cpp : Implementation of CGenericFilter
#include "stdafx.h"
#include "Filter.h"
#include "MyFilter.h"
/////////////////////////////////////////////////////////////////////////////
// CGenericFilter
CGenericFilter::CGenericFilter()
{
}
CGenericFilter::~CGenericFilter()
{
}
HRESULT CGenericFilter::FinalContruct()
{
HRESULT hres = S_OK;
m_pMultiEventControl = NULL;
return hres;
}
void CGenericFilter::FinalRelease()
{
if(m_pMultiEventControl != NULL)
{
m_pMultiEventControl->Release();
}
}
////////////////////////////////////////////
//Helper Methods
HRESULT CGenericFilter::ExtractSubscriptionData(IEventSubscription* pSubscription,SubscriptionData* pSubscriptionData)const
{
USES_CONVERSION;
HRESULT hres = S_OK;
WCHAR guidBuf[130];
BSTR bstrTemp;
//Description
hres = pSubscription->get_Description(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrDescription = bstrTemp;
::SysFreeString(bstrTemp);
//Event class CLSID
hres = pSubscription->get_EventClassID(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrEventClassID = bstrTemp;
::SysFreeString(bstrTemp);
//Interface IID
hres = pSubscription->get_InterfaceID(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
if(bstrTemp != NULL)
{
wcscpy(guidBuf,bstrTemp);
hres = ::CLSIDFromString(guidBuf,&(pSubscriptionData->iidInterfaceID));
if(FAILED(hres))
{
return hres;
}
}
else
{
pSubscriptionData->iidInterfaceID = IID_NULL;
}
::SysFreeString(bstrTemp);
//Machine Name
hres = pSubscription->get_MachineName(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrMachineName = bstrTemp;
::SysFreeString(bstrTemp);
//Method name
hres = pSubscription->get_methodName(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrMethodName = bstrTemp;
::SysFreeString(bstrTemp);
//Owner SID
hres = pSubscription->get_OwnerSID(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrOwnerSID = bstrTemp;
::SysFreeString(bstrTemp);
//Per User
hres = pSubscription->get_PerUser((long*)(&(pSubscriptionData->bPerUser)));
if(FAILED(hres))
{
return hres;
}
//Publisher ID
hres = pSubscription->get_PublisherID(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrPublisherID = bstrTemp;
::SysFreeString(bstrTemp);
//Subscriber CLSID
hres = pSubscription->get_SubscriberCLSID(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
if(bstrTemp != NULL)
{
wcscpy(guidBuf,bstrTemp);
hres = ::CLSIDFromString(guidBuf,&(pSubscriptionData->clsidSubscriberCLSID));
if(FAILED(hres))
{
return hres;
}
}
else
{
pSubscriptionData->clsidSubscriberCLSID = CLSID_NULL;
}
::SysFreeString(bstrTemp);
hres = ::CLSIDFromString(guidBuf,&(pSubscriptionData->clsidSubscriberCLSID));
if(FAILED(hres))
{
return hres;
}
//Subscription ID
hres = pSubscription->get_SubscriptionID(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrSubscriptionID = bstrTemp;
::SysFreeString(bstrTemp);
//Subscription Name
hres = pSubscription->get_SubscriptionName(&bstrTemp);
if(FAILED(hres))
{
::SysFreeString(bstrTemp);
return hres;
}
pSubscriptionData->bstrSubscriptionName = bstrTemp;
::SysFreeString(bstrTemp);
return hres;
}
////////////////////////////////////////////
// IMultiInterfacePublisherFilter
STDMETHODIMP CGenericFilter::Initialize(IMultiInterfaceEventControl* pMultiEventControl)
{
HRESULT hres = S_OK;
//Should we AddRef as well?
m_pMultiEventControl = pMultiEventControl;
return hres;
}
STDMETHODIMP CGenericFilter::PrepareToFire(IID* piidSink, BSTR bstrMethodName,IFiringControl* pFiringControl)
{
HRESULT hres = S_OK;
DWORD dwCount = 0;
IEnumEventObject* pEnum = NULL;
IEventSubscription* pSubscription = NULL;
IEventObjectCollection* pEventCollection = NULL;
_bstr_t bstrCriteria = GetCriteria();
if(m_pMultiEventControl == NULL)
{
return E_FAIL;//Initialize never called. Bug in COM+
}
hres = m_pMultiEventControl->GetSubscriptions(piidSink,bstrMethodName,bstrCriteria,NULL,&pEventCollection);
if(FAILED(hres))
return hres;
//Iterate over the subscribers,and filter in this example by name
hres = pEventCollection->get_NewEnum(&pEnum);//Not the same as get__NewEnum
pEventCollection->Release();
if(FAILED(hres))
return hres;
while(TRUE)
{
hres = pEnum->Next(1,(IUnknown**)&pSubscription,&dwCount);
if(S_OK != hres)
{
//Returns S_FALSE when no more items
if(S_FALSE == hres)
{
hres = S_OK;
}
break;
}
BOOL bEnabled = FALSE;
hres = pSubscription->get_Enabled((long*)(&bEnabled));
if(FAILED(hres) || bEnabled == FALSE)
{
pSubscription->Release();
continue;
}
SubscriptionData subscriptionData;
subscriptionData.iidSink = *piidSink;
hres = ExtractSubscriptionData(pSubscription,&subscriptionData);
if(FAILED(hres))
{
pSubscription->Release();
continue;
}
BOOL bFire = ShouldFire(subscriptionData);
if(bFire)
{
pFiringControl->FireSubscription(pSubscription);
}
pSubscription->Release();
}
pEnum->Release();
return hres;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -