You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
342 lines
7.6 KiB
342 lines
7.6 KiB
//+----------------------------------------------------------------------------
|
|
// File: main.cxx
|
|
//
|
|
// Synopsis: This file contains the core routines and globals for creating
|
|
// LICMGR.DLL
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// Includes -------------------------------------------------------------------
|
|
#include <mgr.hxx>
|
|
#include <factory.hxx>
|
|
|
|
|
|
// Globals --------------------------------------------------------------------
|
|
BEGIN_PROCESS_ATTACH
|
|
ATTACH_METHOD(ProcessAttachMIME64)
|
|
END_PROCESS_ATTACH
|
|
|
|
BEGIN_PROCESS_DETACH
|
|
END_PROCESS_DETACH
|
|
|
|
BEGIN_THREAD_ATTACH
|
|
END_THREAD_ATTACH
|
|
|
|
BEGIN_THREAD_DETACH
|
|
END_THREAD_DETACH
|
|
|
|
BEGIN_PROCESS_PASSIVATE
|
|
END_PROCESS_PASSIVATE
|
|
|
|
BEGIN_THREAD_PASSIVATE
|
|
END_THREAD_PASSIVATE
|
|
|
|
BEGIN_CLASS_FACTORIES
|
|
FACTORY(CLSID_LicenseManager, LicenseManagerFactory, NULL)
|
|
END_CLASS_FACTORIES
|
|
|
|
DEFINE_REGISTRY_SECKEY(LicenseManagerCLSID, CLSID, {5220cb21-c88d-11cf-b347-00aa00a28331})
|
|
DEFAULT_VALUE(Microsoft Licensed Class Manager 1.0)
|
|
BEGIN_SUBKEY(Implemented Categories)
|
|
BEGIN_SUBKEY({7DD95801-9882-11CF-9FA9-00AA006C42C4})
|
|
END_SUBKEY
|
|
BEGIN_SUBKEY({7DD95802-9882-11CF-9FA9-00AA006C42C4})
|
|
END_SUBKEY
|
|
END_SUBKEY
|
|
BEGIN_SUBKEY(InprocServer32)
|
|
DEFAULT_VALUE(<m>)
|
|
BEGIN_NAMED_VALUES
|
|
NAMED_VALUE(ThreadingModel, Apartment)
|
|
END_NAMED_VALUES
|
|
END_SUBKEY
|
|
BEGIN_SUBKEY(MiscStatus)
|
|
DEFAULT_VALUE(0)
|
|
END_SUBKEY
|
|
BEGIN_SUBKEY(ProgID)
|
|
DEFAULT_VALUE(License.Manager.1)
|
|
END_SUBKEY
|
|
BEGIN_SUBKEY(Version)
|
|
DEFAULT_VALUE(1.0)
|
|
END_SUBKEY
|
|
BEGIN_SUBKEY(VersionIndependentProgID)
|
|
DEFAULT_VALUE(License.Manager)
|
|
END_SUBKEY
|
|
END_REGISTRY_KEY
|
|
|
|
DEFINE_REGISTRY_KEY(LicenseManagerProgID, License.Manager.1)
|
|
DEFAULT_VALUE(Microsoft Licensed Class Manager 1.0)
|
|
BEGIN_SUBKEY(CLSID)
|
|
DEFAULT_VALUE({5220cb21-c88d-11cf-b347-00aa00a28331})
|
|
END_SUBKEY
|
|
END_REGISTRY_KEY
|
|
|
|
DEFINE_REGISTRY_KEY(LicenseManagerVProgID, License.Manager)
|
|
DEFAULT_VALUE(Microsoft Licensed Class Manager)
|
|
BEGIN_SUBKEY(CurVer)
|
|
DEFAULT_VALUE(License.Manager.1)
|
|
END_SUBKEY
|
|
END_REGISTRY_KEY
|
|
|
|
BEGIN_REGISTRY_KEYS
|
|
REGISTRY_KEY(LicenseManagerCLSID)
|
|
REGISTRY_KEY(LicenseManagerProgID)
|
|
REGISTRY_KEY(LicenseManagerVProgID)
|
|
END_REGISTRY_KEYS
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// Function: AllocateThreadState
|
|
//
|
|
// Synopsis:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT
|
|
AllocateThreadState(
|
|
THREADSTATE ** ppts)
|
|
{
|
|
Assert(ppts);
|
|
|
|
*ppts = new THREADSTATE;
|
|
if (!*ppts)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
memset(*ppts, 0, sizeof(THREADSTATE));
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: LicensedClassManagerFactory
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT
|
|
LicenseManagerFactory(
|
|
IUnknown * pUnkOuter,
|
|
REFIID riid,
|
|
void ** ppvObj)
|
|
{
|
|
CLicenseManager * plcmgr = new CLicenseManager(pUnkOuter);
|
|
|
|
if (!plcmgr)
|
|
{
|
|
*ppvObj = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
return plcmgr->PrivateQueryInterface(riid, ppvObj);
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Member: CLicenseManager
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
CLicenseManager::CLicenseManager(
|
|
IUnknown * pUnkOuter)
|
|
: CComponent(pUnkOuter)
|
|
{
|
|
_pUnkSite = NULL;
|
|
|
|
_fDirty = FALSE;
|
|
_fLoaded = FALSE;
|
|
_fPersistPBag = FALSE;
|
|
_fPersistStream = FALSE;
|
|
|
|
_guidLPK = GUID_NULL;
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Member: ~CLicenseManager
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
CLicenseManager::~CLicenseManager()
|
|
{
|
|
int i;
|
|
|
|
for (i = _aryLic.Size()-1; i >= 0; i--)
|
|
{
|
|
::SysFreeString(_aryLic[i].bstrLic);
|
|
::SRelease(_aryLic[i].pcf2);
|
|
}
|
|
|
|
::SRelease(_pUnkSite);
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Member: SetSite
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
STDMETHODIMP
|
|
CLicenseManager::SetSite(
|
|
IUnknown * pUnkSite)
|
|
{
|
|
::SClear(&_pUnkSite);
|
|
|
|
_pUnkSite = pUnkSite;
|
|
if (_pUnkSite)
|
|
{
|
|
_pUnkSite->AddRef();
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Member: GetSite
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
STDMETHODIMP
|
|
CLicenseManager::GetSite(
|
|
REFIID riid,
|
|
void ** ppvSite)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (!ppvSite)
|
|
return E_INVALIDARG;
|
|
|
|
if (_pUnkSite)
|
|
{
|
|
hr = _pUnkSite->QueryInterface(riid, ppvSite);
|
|
}
|
|
else
|
|
{
|
|
*ppvSite = NULL;
|
|
hr = E_FAIL;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Member: SetClientSite
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
STDMETHODIMP
|
|
CLicenseManager::SetClientSite(
|
|
IOleClientSite * pClientSite)
|
|
{
|
|
return SetSite(pClientSite);
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Member: GetClientSite
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
STDMETHODIMP
|
|
CLicenseManager::GetClientSite(
|
|
IOleClientSite ** ppClientSite)
|
|
{
|
|
return GetSite(IID_IOleClientSite, (void **)ppClientSite);
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Member: PrivateQueryInterface
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT
|
|
CLicenseManager::PrivateQueryInterface(
|
|
REFIID riid,
|
|
void ** ppvObj)
|
|
{
|
|
if (riid == IID_IObjectWithSite)
|
|
*ppvObj = (IObjectWithSite *)this;
|
|
|
|
else if (riid == IID_IOleObject)
|
|
*ppvObj = (IOleObject *)this;
|
|
|
|
else if (riid == IID_ILicensedClassManager)
|
|
*ppvObj = (ILicensedClassManager *)this;
|
|
|
|
else if (riid == IID_ILocalRegistry)
|
|
*ppvObj = (ILocalRegistry *)this;
|
|
|
|
else if (riid == IID_IRequireClasses)
|
|
*ppvObj = (IRequireClasses *)this;
|
|
|
|
else if (riid == IID_IPersistStream && !_fPersistPBag)
|
|
{
|
|
_fPersistStream = TRUE;
|
|
*ppvObj = (IPersistStream *)this;
|
|
}
|
|
|
|
else if (riid == IID_IPersistStreamInit && !_fPersistPBag)
|
|
{
|
|
_fPersistStream = TRUE;
|
|
*ppvObj = (IPersistStreamInit *)this;
|
|
}
|
|
|
|
else if (riid == IID_IPersistPropertyBag && !_fPersistStream)
|
|
{
|
|
_fPersistPBag = TRUE;
|
|
*ppvObj = (IPersistPropertyBag *)this;
|
|
}
|
|
|
|
if (*ppvObj)
|
|
return S_OK;
|
|
else
|
|
return parent::PrivateQueryInterface(riid, ppvObj);
|
|
}
|