📄 adminwrap.cpp
字号:
#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 + -