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

📄 adminwrap.cpp

📁 中间件编写示例 COM与.NET组件服务
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <stdafx.h>
#include <comutil.h>
#include <comadmin.h>
#include <assert.h>

#include "macro.h"
#include "Adminwrap.h"
#include <atlbase.h>
//*********************************************
// Globals

WCHAR g_wczAPP[]          = L"Applications";
WCHAR g_wczCOMP[]         = L"Components";
WCHAR g_wczNAME[]         = L"Name";
WCHAR g_wczProgIDProp[]   = L"ProgID";
WCHAR g_wczSUB[]          = L"SubscriptionsForComponent";
WCHAR g_wczTRANSUB[]      = L"TransientSubscriptions";
WCHAR g_wczPUBPROP[]      = L"PublisherProperties";
WCHAR g_wczTRANSPUBPROP[] = L"TransientPublisherProperties";

_bstr_t g_bAPP            = g_wczAPP;
_bstr_t g_bCOMP           = g_wczCOMP;
_bstr_t g_bPUBID          = L"PublisherID";
_bstr_t g_bFILTER         = L"MultiInterfacePublisherFilterCLSID";
_bstr_t g_bALLOWINPROC    = L"AllowInprocSubscribers";
_bstr_t g_bFIREINPARALLEL = L"FireInParallel";
_bstr_t g_bSUB            = g_wczSUB;
_bstr_t g_bNAME           = L"Name";
_bstr_t g_bVALUE          = L"Value";
_bstr_t g_bECID           = L"EventCLSID";
_bstr_t g_bIID            = L"InterfaceID";
_bstr_t g_bMETHOD         = L"MethodName";
_bstr_t g_bCRITERIA       = L"FilterCriteria";
_bstr_t g_bPUBPROP        = g_wczPUBPROP;
_bstr_t g_bTRANSSUB       = g_wczTRANSUB;
_bstr_t g_bSUBINT         = L"SubscriberInterface";
_bstr_t g_bTRANSPUBPROP   = g_wczTRANSPUBPROP;


//////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::CApp
// Purppose    : CApp constructor
// Parameters  :
//             : ICOMAdminCatalog* pcat - Pointer to ICOMAdminCatalog interface
//             : WCHAR* pwzAppName         - Name of the Application
///////////////////////////////////////////////////////////////////////////////////////
CApp::CApp()
{
   HRESULT hr = ::CoCreateInstance(__uuidof(COMAdminCatalog), NULL, CLSCTX_SERVER, __uuidof(ICOMAdminCatalog),(LPVOID*) &m_pAdminCatalog);
   ASSERT(SUCCEEDED(hr));
}
CApp::CApp(ICOMAdminCatalog* pAdminCatalog, WCHAR* pwzAppName)
{
   if (pAdminCatalog)
   {
      m_pAdminCatalog = pAdminCatalog;
      m_pAdminCatalog->AddRef();
   }

   m_pwzAppName = new WCHAR[wcslen(pwzAppName)+1];

   wcscpy(m_pwzAppName, pwzAppName); 
}

//////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::~CApp
// Purppose    : CApp destructor
///////////////////////////////////////////////////////////////////////////////////////
CApp::~CApp()
{
   SAFERELEASE(m_pAdminCatalog);
   if (m_pwzAppName)
   {
      DeleteApp();
      delete [] m_pwzAppName;
      m_pwzAppName=0;
   }
}

//////////////////////////////////////////////////////////////////////////////////////
// Name         : CApp::SetProperties
// Purppose     : Sets the properties of the CApp object
// Parameters   :
//              : ICOMAdminCatalog* pcat - Pointer to ICOMAdminCatalog interface
//              : WCHAR* pwzAppName         - Name of the Application
// Return Value : HRESULT
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::SetProperties(ICOMAdminCatalog* pAdminCatalog, WCHAR* pwzAppName)
{
   if (!pAdminCatalog || !pwzAppName)
      return E_POINTER;

   SAFERELEASE(m_pAdminCatalog);
   m_pAdminCatalog = pAdminCatalog;
   m_pAdminCatalog->AddRef();

   if (m_pwzAppName)
   {
      DeleteApp();
      delete [] m_pwzAppName;
      m_pwzAppName=0;
   }

   m_pwzAppName = new WCHAR[wcslen(pwzAppName)+1];

   wcscpy(m_pwzAppName, pwzAppName);
   return S_OK;
}

//////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::CreateApp
// Purppose    : Creates a COM+ Application
// Parameters  :
//             : BOOL bServer - Specifies if is a Server app of Library app
//             : BOOL bQueued - Specifies if the app is QUEUED or not
// Return Value : HRESULT
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::CreateApp(BOOL bServer, BOOL bQueued)
{
   HRESULT           hr =0;
   ICatalogObject    *pobj = 0;
   ICatalogCollection   *pcoll = 0;
   IDispatch         *pdisp = 0;
   _bstr_t           bname; ;
   long           lret =0;
   VARIANT           var;

   if (!m_pwzAppName || !m_pAdminCatalog)
      return E_POINTER;

   hr = GetCollection(m_pAdminCatalog, g_bAPP, &pcoll);
   exit(hr);

   hr = pcoll->Add(&pdisp);
   exit(hr);

   hr = pdisp->QueryInterface(__uuidof(ICatalogObject), (void**)&pobj);
   exit(hr);

   VariantInit(&var);

   var.vt = VT_BSTR;
   var.bstrVal = SysAllocString(m_pwzAppName);
   if (!var.bstrVal)
      exit(hr=E_OUTOFMEMORY);

   hr = pobj->put_Value(g_bNAME, var);
   exit(hr);

   bname = L"Activation";
   VariantClear(&var);
   var.vt = VT_BOOL;
   var.boolVal = (short) bServer;

   hr = pobj->put_Value(bname,var);
   exit(hr);

   bname = L"QueuingEnabled";
   var.vt = VT_BOOL;
   var.boolVal = (short) bQueued;
   
   hr = pobj->put_Value(bname,var);
   exit(hr);

   bname = L"QueueListenerEnabled";
   var.vt = VT_BOOL;
   var.boolVal = (short) bQueued;

   hr = pobj->put_Value(bname,var);
   exit(hr);      

   hr = pcoll->SaveChanges(&lret);

exit:
   VariantClear(&var);
   SAFERELEASE(pcoll);
   SAFERELEASE(pobj);
   SAFERELEASE(pdisp);

   ASSERT_AND_RETURN(hr);
   return hr;
}

//////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::DeleteApp
// Purppose    : Deletes a COM+ Application and its components
// Parameters  :
// Return Value : HRESULT
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::DeleteApp()
{
   HRESULT           hr = E_FAIL;
   ICatalogCollection   *pApps = NULL;
   ICatalogObject    *pApp = NULL;
   _bstr_t           bappname;

   if (!m_pwzAppName || !m_pAdminCatalog)
      return E_POINTER;

   bappname = m_pwzAppName;

   hr = GetCollection(m_pAdminCatalog, g_bAPP, &pApps);
   exit(hr);
   hr = RemoveNamedObjectFromCollection(pApps, bappname, APPLICATION); 
   m_pwzAppName = NULL;
exit:
   SAFERELEASE(pApps);
   SAFERELEASE(pApp);
   ASSERT_AND_RETURN(hr);

   return hr;
}

//////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::InstallComponent
// Purppose    : Installs a component
// Parameters  :
//             : WCHAR* pwzcompdllname    - Path of the dll which exports this 
//                                          component
// Return Value : HRESULT
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::InstallComponent(WCHAR* pwzcompdllname)
{
   _bstr_t        bappname, bdllname;

   if (!m_pwzAppName || !pwzcompdllname || !m_pAdminCatalog)
      return E_INVALIDARG;

   bappname = m_pwzAppName;
   bdllname = pwzcompdllname;
   
   HRESULT hres = m_pAdminCatalog->InstallComponent(bappname, pwzcompdllname, 0, 0);
      
   ASSERT_AND_RETURN(hres);

   return hres;
}

//////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::RemoveComponent
// Purppose    : Removes the specified component from the application
// Parameters  :
//             : WCHAR* progid - Name of the component
// Return Value : HRESULT
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::RemoveComponent(WCHAR* progid)
{
   ICatalogCollection      *pApps=0, *pComps=0;
   ICatalogObject       *pApp=0;
   HRESULT              hr =0;

   if (!m_pwzAppName || !m_pAdminCatalog || !progid)
      return E_INVALIDARG;


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

   hr = GetCollection(pApps, pApp, g_bCOMP, &pComps);
   exit(hr);

   hr = RemoveNamedObjectFromCollection(pComps, _bstr_t(progid), COMPONENT);

exit:
   SAFERELEASE(pApps);
   SAFERELEASE(pComps);
   SAFERELEASE(pApp);
   
   return hr;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::AddEventClass
// Purppose    : Installs an EventClass component under the application
// Parameters  :
//             : WCHAR* pwzdllname      - Dll path that has DllRegisterServer exported
//             : WCHAR* pwztlbpath      - TLB path that contains Firing Interface definitions
//             : WCHAR* pwzCompName     - Name of the component
//             : WCHAR* pwzPublisherID  - Name of the Publisher
//             : WCHAR* pwzFilterCLSID  - CLSID (in string from) of the filter component
//             : BOOL   fAllowinproc    - Flag that sets the "AllowInProcSubscribers" property
//             : BOOL   fFireinparallel - Flag that decides if it is serial or parallel firing
// Return Value : HRESULT
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CApp::AddEventClass(WCHAR* pwzdllname, WCHAR* pwztlbpath, WCHAR* pwzCompName, WCHAR* pwzPublisherID, WCHAR* pwzFilterCLSID, BOOL fAllowinproc, BOOL fFireinparallel)
{
   HRESULT              hr = 0;
   ICatalogCollection      *pApps=0, *pComps=0;
   ICatalogObject       *pApp=0, *pComp=0;
   long              lret =0;
   _bstr_t              bapp, bdll("\0"), btlb("\0");
   BOOL              fCreate=FALSE, fComplete = FALSE;

   if (!pwzdllname || !m_pAdminCatalog || !m_pwzAppName || !pwzCompName)
      return E_INVALIDARG;

   if (pwzdllname)
      bdll = pwzdllname;

   if (pwztlbpath)
      btlb = pwztlbpath;
   
   bapp = m_pwzAppName;

   hr = m_pAdminCatalog->InstallEventClass(bapp, bdll, btlb,0);
   exit(hr);

   fCreate = TRUE;

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

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

   hr = SetStringProperty(pComp, g_bPUBID, pwzPublisherID);
   exit(hr);

   hr = SetStringProperty(pComp, g_bFILTER, pwzFilterCLSID);
   exit(hr);

   hr = SetBoolProperty(pComp, g_bALLOWINPROC, fAllowinproc);
   exit(hr);

   hr = SetBoolProperty(pComp, g_bFIREINPARALLEL, fFireinparallel);
   exit(hr);

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

   fComplete = TRUE;
   
exit:
   if (fCreate && !fComplete)
      RemoveComponent(pwzCompName);

   SAFERELEASE(pComp);
   SAFERELEASE(pApps);
   SAFERELEASE(pComps);
   SAFERELEASE(pApps);

   return hr;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Name        : CApp::AddSubscription
// Purppose    : Creates a Persistent Subscription
// Parameters  :
//             : WCHAR* pwzProgID   - Name of the component for which the subscription to be created
//             : WCHAR* pwzSubName  - Name of the subscription
//             : WCHAR* pwzECID     - EventClass ID
//             : WCHAR* pwzPubID    - Name of the Publisher
//             : WCHAR* pwzIID      - Interface Name (in string form)
//             : 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::AddSubscription(WCHAR* pwzProgID, WCHAR* pwzSubName, WCHAR* pwzECID, WCHAR* pwzPubID, WCHAR* pwzIID, WCHAR* pwzMethod, WCHAR* pwzCriteria, WCHAR* pwzPubProp, WCHAR* pwzPubVal)
{
   HRESULT           hr=0;
   ICatalogObject    *pApp=0,  *pComp=0, *pSub=0, *pProp=0;
   ICatalogCollection  *pApps=0, *pComps=0, *pSubs=0, *pProps=0;
   IDispatch         *pDisp=0;
   _bstr_t           bcomp, bapp;
   BOOL           fCreate=FALSE, fComplete = FALSE;
   long           lret;

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

   bcomp = pwzProgID;
   bapp  = m_pwzAppName;

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

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

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

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

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

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

   hr = SetStringProperty(pSub, g_bECID, pwzECID);
   exit(hr);

   hr = SetStringProperty(pSub, g_bPUBID, pwzPubID);

⌨️ 快捷键说明

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