⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfilter.cpp

📁 中间件编写示例 COM与.NET组件服务
💻 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 + -