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

📄 adminwrap.cpp

📁 中间件编写示例 COM与.NET组件服务
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   exit(hr);

   hr = SetStringProperty(pSub, g_bIID, pwzIID);
   exit(hr);

   hr = SetStringProperty(pSub, g_bMETHOD, pwzMethod);
   exit(hr);

   hr = SetStringProperty(pSub, g_bCRITERIA, pwzCriteria);
   exit(hr);

   hr = pSubs->SaveChanges(&lret);
   exit(hr);

   fCreate = TRUE;

   if (pwzPubProp && pwzPubVal)
   {
      hr = GetCollection(pSubs, pSub, g_bPUBPROP, &pProps);
      exit(hr);

      SAFERELEASE(pDisp);
      hr = pProps->Add(&pDisp);
      exit(hr);

      hr = pDisp->QueryInterface(__uuidof(ICatalogObject), (LPVOID*)&pProp);
      exit(hr);

      hr = SetStringProperty(pProp, g_bNAME, pwzPubProp);
      exit(hr);

      hr = SetStringProperty(pProp, g_bVALUE, pwzPubVal);
      exit(hr);

      hr = pProps->SaveChanges(&lret);
      exit(hr);
   }

   fComplete = TRUE; 

exit:
   if (fCreate && !fComplete)
      RemoveSubscription(pwzProgID, pwzSubName);

   SAFERELEASE(pDisp);
   SAFERELEASE(pProp);
   SAFERELEASE(pProps);
   SAFERELEASE(pDisp);
   SAFERELEASE(pSub);
   SAFERELEASE(pSubs);
   SAFERELEASE(pComp);
   SAFERELEASE(pComps);
   SAFERELEASE(pApp);
   SAFERELEASE(pApps);
   return hr;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::RemoveSubscription
// Purppose    : Removes a Persistent Subscription
// Parameters  :
//             : WCHAR* pwzProgID  - Name of the component for which the subscription to be deleted
//             : WCHAR* pwzSubName - Name of the subscription
// Return Value : HRESULT
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::RemoveSubscription(WCHAR* pwzProgID, WCHAR* pwzSubName)
{
   HRESULT           hr =0;
   ICatalogObject    *pApp =0, *pComp=0;
   ICatalogCollection   *pApps=0, *pComps=0, *pSubs=0;

   if (!m_pAdminCatalog || !m_pwzAppName || !pwzProgID || !pwzSubName)
      return E_INVALIDARG;

   hr = GetObjectAndCollection(m_pAdminCatalog, g_bAPP, _bstr_t(m_pwzAppName), APPLICATION, &pApps, &pApp);
   exit(hr);

   hr = GetObjectAndCollection(pApps, pApp, g_bCOMP, _bstr_t(pwzProgID), COMPONENT, &pComps, &pComp);
   exit(hr);

   hr = GetCollection(pComps, pComp, g_bSUB, &pSubs);
   exit(hr);

   hr = RemoveNamedObjectFromCollection(pSubs, _bstr_t(pwzSubName), SUBSCRIPTION);

exit:
   SAFERELEASE(pSubs);
   SAFERELEASE(pApp);
   SAFERELEASE(pApps);

   return hr;
}

HRESULT CApp::AddTransientSubscription(WCHAR* pwzSubName,CLSID clsidEventClass,IID iidInterface, IUnknown *punk)
{
   return AddTransientSubscription(pwzSubName,clsidEventClass,NULL,iidInterface,punk,NULL,NULL,NULL,NULL);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::AddTransientSubscription
// Purppose    : Adds a Persistent Subscription
// Parameters  :
//             : WCHAR* pwzSubName  - Name of the subscription
//             : CLSID  clsidEventClass - EventClass ID
//             : WCHAR* pwzPubID    - Name of the Publisher
//             : IID    iidInterface - Interface ID
//             : IUnknown* punk     - IUnknown* of the subscriber
//             : WCHAR* pwzMethod   - Method in the interface to subscribe
//             : WCHAR* pwzCriteria - Filter Criteria (used in parameterized filtering)
//             : WCHAR* pwzPubProp  - Publisher Property Name
//             : WCHAR* pwzPubVal   - Publisher Property Value
// Return Value : HRESULT
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::AddTransientSubscription(WCHAR* pwzSubName,CLSID clsidEventClass, WCHAR* pwzPubID,IID iidInterface, IUnknown *punk, WCHAR* pwzMethod, WCHAR* pwzCriteria, WCHAR* pwzPubProp, WCHAR* pwzPubVal)
{
   HRESULT            hres = S_OK;
   ICatalogObject     *pSub=0, *pProp=0;
   ICatalogCollection *pSubs=0, *pProps=0;
   IDispatch          *pDisp=0;
   long               lret=0;
   BOOL               fCreate = FALSE, fComplete = FALSE;
   WCHAR*  pwsEventClass = NULL;
   WCHAR*  pwsInterfaceIID = NULL;

   if (!pwzSubName || !punk)
      return E_INVALIDARG;

   hres = ::StringFromCLSID(clsidEventClass, &pwsEventClass);
   ASSERT_AND_RETURN(hres);

   if(IID_NULL == iidInterface)
   {
      pwsInterfaceIID = NULL;
   }
   else
   {
      hres = ::StringFromCLSID(iidInterface, &pwsInterfaceIID);
      ASSERT_AND_RETURN(hres);
   }

   ICOMAdminCatalog* pAdminCat = NULL;

   hres = ::CoCreateInstance(__uuidof(COMAdminCatalog), NULL, CLSCTX_SERVER, __uuidof(ICOMAdminCatalog),(LPVOID*) &pAdminCat);
   ASSERT_AND_RETURN(hres);

   hres = GetCollection(pAdminCat, g_bTRANSSUB, &pSubs);
   exit(hres);
   pAdminCat->Release();

   hres = pSubs->Add(&pDisp);
   exit(hres);

   hres = pDisp->QueryInterface(__uuidof(ICatalogObject), (LPVOID*)&pSub);
   exit(hres);

   hres = SetStringProperty(pSub, g_bNAME, pwzSubName);
   exit(hres);

   hres = SetStringProperty(pSub, g_bECID, pwsEventClass);
   exit(hres);

   hres = SetStringProperty(pSub, g_bPUBID, pwzPubID);
   exit(hres);

   hres = SetStringProperty(pSub, g_bIID, pwsInterfaceIID);
   exit(hres);

   hres = SetIUnknownProperty(pSub, g_bSUBINT, punk);
   exit(hres);

   hres = SetStringProperty(pSub, g_bMETHOD, pwzMethod);
   exit(hres);

   hres = SetStringProperty(pSub, g_bCRITERIA, pwzCriteria);
   exit(hres);

   hres = pSubs->SaveChanges(&lret);
   exit(hres);

   fCreate = TRUE;

   if (pwzPubProp && pwzPubVal)
   {

      hres = GetCollection(pSubs, pSub, g_bTRANSPUBPROP, &pProps);
      exit(hres);

      SAFERELEASE(pDisp);
      hres = pProps->Add(&pDisp);
      exit(hres);

      hres = pDisp->QueryInterface(__uuidof(ICatalogObject), (LPVOID*)&pProp);
      exit(hres);

      hres = SetStringProperty(pProp, g_bNAME, pwzPubProp);
      exit(hres);
      
      hres = SetStringProperty(pProp, g_bVALUE, pwzPubVal);
      exit(hres);

      hres = pProps->SaveChanges(&lret);
      exit(hres);
   }

   fComplete = TRUE;
   
exit:
   if (fCreate && !fComplete)
      RemoveTransientSubscription(pwzSubName);
   SAFERELEASE(pDisp);
   SAFERELEASE(pProp);
   SAFERELEASE(pProps);
   SAFERELEASE(pSub);
   SAFERELEASE(pSubs);
      
   ASSERT_AND_RETURN(hres);

   return hres;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::RemoveTransientSubscription
// Purppose    : Remolves a Persistent Subscription
// Parameters  :
//             : WCHAR* pwzSubName - Name of the subscription
// Return Value : HRESULT
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::RemoveTransientSubscription(WCHAR* pwzName)
{
   HRESULT              hr =0;
   ICatalogCollection      *pSubs=0;

   if (!pwzName)
      return E_INVALIDARG;

   ICOMAdminCatalog* pAdminCat = NULL;

   hr = ::CoCreateInstance(__uuidof(COMAdminCatalog), NULL, CLSCTX_SERVER, __uuidof(ICOMAdminCatalog),(LPVOID*) &pAdminCat);
   ASSERT(SUCCEEDED(hr));

   hr = GetCollection(pAdminCat, g_bTRANSSUB, &pSubs);
   exit(hr);

   pAdminCat->Release();

   hr = RemoveNamedObjectFromCollection(pSubs, _bstr_t(pwzName), TRANSIENTSUB);
exit:
   SAFERELEASE(pSubs);
   return hr;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::SetProperty
// Purppose    : Sets a property on any component (Application, EventClass, Component, Persistent 
//             : subscription, Transient subscription, Persistent sub. property bag, Trans sub. 
//             : property bag)
// Parameters  :
//             : ADMINTYPE type      - Type of the component
//             : WCHAR* pwztypename  - Value depends on the type
//             : WCHAR* pwztypename2 - Value depends on the type
//             : WCHAR* pwzPropName  - Name of the Property
// Return Value : HRESULT
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::SetProperty(ADMINTYPE type, WCHAR* pwztypename, WCHAR* pwztypename2, WCHAR* pwzPropName, VARIANT& var)
{
   HRESULT             hr=0;
   long                lindex;
   _bstr_t             bname;
   VARIANT             varname;
   ICatalogObject     *pApp=0, *pComp=0, *pSub=0, *pProp=0, *pFinal=0;
   ICatalogCollection *pApps=0, *pComps=0, *pSubs=0, *pProps=0, *pFinals=0;
   IDispatch          *pDisp=0;
   long                lret =0;
   

   // ADMINTYPE               pwztypename         pwztypename2         
   //========================================================================
   // APPLICATION             Ignored             Ignored              
   // COMPONENT               progid of the comp  Ignored           
   // SUBSCRIPTION            progid of the comp  name of the sub      
   // TRANSIENTSUB            name of the sub     Ignored           
   // PUBPROP                 progid of the comp  name of the sub      
   // TRANSIENTPUBPROP        name of the sub     Ignored
   if (!m_pAdminCatalog || !m_pwzAppName || var.vt == VT_EMPTY)
      return E_INVALIDARG;

   hr = GetObjectAndCollection(m_pAdminCatalog, g_bAPP, _bstr_t(m_pwzAppName), APPLICATION, &pApps, &pApp);
   exit(hr);
   bname = pwzPropName;

   switch(type)
   {
   case APPLICATION:
      if (!pwzPropName)
         exit(hr= E_INVALIDARG);
      pFinal = pApp;
      pFinals = pApps;
      break;

   case COMPONENT:
      if (!pwztypename || !pwzPropName)
         exit(hr= E_INVALIDARG);

      hr = GetObjectAndCollection(pApps, pApp, g_bCOMP, _bstr_t(pwztypename), COMPONENT, &pComps, &pComp);
      exit(hr);
      pFinal = pComp;
      pFinals = pComps;
      break; 

   case SUBSCRIPTION:
      if (!pwztypename || !pwztypename2 || !pwztypename)
         exit(hr= E_INVALIDARG);

      hr = GetObjectAndCollection(pApps, pApp, g_bCOMP, _bstr_t(pwztypename), COMPONENT, &pComps, &pComp);
      exit(hr);

      hr = GetObjectAndCollection(pComps, pComp, g_bSUB, _bstr_t(pwztypename2), SUBSCRIPTION, &pSubs, &pSub);
      exit(hr);

      pFinal = pSub;
      pFinals = pSubs;
      break;

   case TRANSIENTSUB:
      if (!pwzPropName)
         exit(hr= E_INVALIDARG);
      hr = GetObjectAndCollection(m_pAdminCatalog, g_bTRANSSUB, _bstr_t(pwztypename), TRANSIENTSUB, &pSubs, &pSub);
      exit(hr);

      pFinal = pSub;
      pFinals = pSubs;
      break;

   case PUBPROP:
      if (!pwzPropName || !pwztypename || !pwztypename2)
         exit(hr= E_INVALIDARG);

      hr = GetObjectAndCollection(pApps, pApp, g_bCOMP, _bstr_t(pwztypename), COMPONENT, &pComps, &pComp);
      exit(hr);

      hr = GetObjectAndCollection(pComps, pComp, g_bSUB, _bstr_t(pwztypename2), SUBSCRIPTION, &pSubs, &pSub);
      exit(hr);

      hr = GetCollection(pSubs, pSub, g_bPUBPROP, &pProps);
      exit(hr);

      hr = GetNamedObjectFromCollection(pProps, g_bNAME, &pProp, &lindex, PUBPROP, _bstr_t(pwzPropName));
      if SUCCEEDED(hr)  // Change the VALUE
         bname = g_bVALUE;
      else if  (FAILED(hr) && (lindex == -1))         // Create a new NAME/VALUE property
      {
         hr = pProps->Add(&pDisp);
         exit(hr);

         hr = pDisp->QueryInterface(__uuidof(IDispatch), (LPVOID*)&pProp);
         exit(hr);

         varname.bstrVal = SysAllocString(pwzPropName);
         if (!varname.bstrVal)
            exit(hr=E_OUTOFMEMORY);
         varname.vt = VT_BSTR;

         hr = pProp->put_Value(g_bNAME, varname);
         exit(hr);

         bname = g_bVALUE;
         pFinal = pProp;
         pFinals = pProps;
      }
      else
         exit(hr);
      pFinal = pProp;
      pFinals = pProps;
      break;

   case TRANSIENTPUBPROP:
      if (!pwzPropName || !pwztypename)
         exit(hr= E_INVALIDARG);

      hr = GetObjectAndCollection(m_pAdminCatalog, g_bTRANSSUB, _bstr_t(pwztypename), TRANSIENTSUB, &pSubs, &pSub);
      exit(hr);

      hr = GetCollection(pSubs, pSub, g_bTRANSPUBPROP, &pProps);
      exit(hr);

      hr = GetNamedObjectFromCollection(pProps, g_bNAME, &pProp, &lindex, TRANSIENTPUBPROP, _bstr_t(pwzPropName));
      if SUCCEEDED(hr)  // Change the VALUE
         bname = g_bVALUE;
      else if  (FAILED(hr) && (lindex == -1))      // Create a new NAME/VALUE property
      {
         hr = pProps->Add(&pDisp);
         exit(hr);

         hr = pDisp->QueryInterface(__uuidof(IDispatch), (LPVOID*)&pProp);
         exit(hr);

         varname.bstrVal = SysAllocString(pwzPropName);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -