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.
442 lines
9.9 KiB
442 lines
9.9 KiB
//+-------------------------------------------------------------------
|
|
//
|
|
// Class: CAdvBndCF
|
|
//
|
|
// Synopsis: Class Factory for CAdvBnd
|
|
//
|
|
// Interfaces: IUnknown - QueryInterface, AddRef, Release
|
|
// IClassFactory - CreateInstance
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
#include <advbnd.hxx>
|
|
|
|
|
|
const GUID CLSID_AdvBnd =
|
|
{0x99999999,0x0000,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x48}};
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBndCF::CAdvBndCF()
|
|
//
|
|
// Synopsis: The constructor for CAdvBnd.
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
CAdvBndCF::CAdvBndCF() : _cRefs(1), _pCF(NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBnd::~CAdvBndObj()
|
|
//
|
|
// Synopsis: The destructor for CAdvBnd.
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
CAdvBndCF::~CAdvBndCF()
|
|
{
|
|
if (_pCF)
|
|
{
|
|
_pCF->Release();
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Method: CAdvBndCF::QueryInterface
|
|
//
|
|
// Synopsis: Only IUnknown and IClassFactory supported
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDMETHODIMP CAdvBndCF::QueryInterface(REFIID iid, void FAR * FAR * ppv)
|
|
{
|
|
if (IsEqualIID(iid, IID_IUnknown) ||
|
|
IsEqualIID(iid, IID_IClassFactory))
|
|
{
|
|
*ppv = (IUnknown *) this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAdvBndCF::AddRef(void)
|
|
{
|
|
return ++_cRefs;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAdvBndCF::Release(void)
|
|
{
|
|
if (--_cRefs == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return _cRefs;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Method: CAdvBndCF::CreateInstance
|
|
//
|
|
// Synopsis: This is called by Binding process to create the
|
|
// actual class object
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CAdvBndCF::CreateInstance(
|
|
IUnknown FAR* pUnkOuter,
|
|
REFIID iidInterface,
|
|
void FAR* FAR* ppv)
|
|
{
|
|
Display(TEXT("CAdvBndCF::CreateInstance called\n"));
|
|
|
|
HRESULT hresult;
|
|
|
|
if (!_pCF)
|
|
{
|
|
// Load the class object for the class to aggregate.
|
|
hresult = CoGetClassObject(CLSID_BasicBnd, CLSCTX_SERVER, NULL,
|
|
IID_IClassFactory, (void **) &_pCF);
|
|
|
|
Win4Assert(SUCCEEDED(hresult)
|
|
&& "CAdvBnd::CAdvBnd CoGetClassObject failed");
|
|
|
|
if (FAILED(hresult))
|
|
{
|
|
return hresult;
|
|
}
|
|
}
|
|
|
|
if (pUnkOuter != NULL)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
CAdvBnd * lpcBB = new FAR CAdvBnd((IClassFactory *) _pCF);
|
|
|
|
if (lpcBB == NULL)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
hresult = lpcBB->QueryInterface(iidInterface, ppv);
|
|
|
|
lpcBB->Release();
|
|
|
|
return hresult;
|
|
}
|
|
|
|
STDMETHODIMP CAdvBndCF::LockServer(BOOL fLock)
|
|
{
|
|
if (fLock)
|
|
GlobalRefs(TRUE);
|
|
else
|
|
GlobalRefs(FALSE);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBnd::CAdvBnd()
|
|
//
|
|
// Synopsis: The constructor for CAdvBnd. I
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
CAdvBnd::CAdvBnd(IClassFactory *pcfBase) : _xiunk(), _dwRegister(0), _cRefs(1)
|
|
{
|
|
HRESULT hresult = pcfBase->CreateInstance((IUnknown *) this, IID_IUnknown,
|
|
(void **) &_xiunk);
|
|
|
|
GlobalRefs(TRUE);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBnd::~CAdvBndObj()
|
|
//
|
|
// Synopsis: The destructor for CAdvBnd.
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
CAdvBnd::~CAdvBnd()
|
|
{
|
|
Display(TEXT("CAdvBndCF::~CAdvBnd called\n"));
|
|
|
|
if (_dwRegister != 0)
|
|
{
|
|
// Get the running object table
|
|
IRunningObjectTable *prot;
|
|
|
|
HRESULT hresult = GetRunningObjectTable(0, &prot);
|
|
|
|
Win4Assert(SUCCEEDED(hresult)
|
|
&& "CAdvBnd::~CAdvBnd GetRunningObjectTable failed");
|
|
|
|
hresult = prot->Revoke(_dwRegister);
|
|
|
|
Win4Assert(SUCCEEDED(hresult)
|
|
&& "CAdvBnd::~CAdvBnd Revoke failed");
|
|
|
|
prot->Release();
|
|
}
|
|
|
|
GlobalRefs(FALSE);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBnd::QueryInterface
|
|
//
|
|
// Returns: SUCCESS_SUCCCESS
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDMETHODIMP CAdvBnd::QueryInterface(REFIID iid, void ** ppunk)
|
|
{
|
|
Display(TEXT("CAdvBnd::QueryInterface called\n"));
|
|
|
|
if (IsEqualIID(iid, IID_IUnknown))
|
|
{
|
|
*ppunk = (IUnknown *) this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
else if ((IsEqualIID(iid, IID_IPersistFile)) ||
|
|
(IsEqualIID(iid, IID_IPersist)))
|
|
{
|
|
*ppunk = (IPersistFile *) this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return _xiunk->QueryInterface(iid, ppunk);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAdvBnd::AddRef(void)
|
|
{
|
|
return ++_cRefs;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAdvBnd::Release(void)
|
|
{
|
|
if (--_cRefs == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return _cRefs;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBnd::Load
|
|
//
|
|
// Synopsis: IPeristFile interface - needed 'cause we bind with
|
|
// file moniker and BindToObject insists on calling this
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDMETHODIMP CAdvBnd::Load(LPCOLESTR lpszFileName, DWORD grfMode)
|
|
{
|
|
Display(TEXT("CAdvBndCF::Load called\n"));
|
|
|
|
// Forward call to delegated class
|
|
IPersistFile *pipfile;
|
|
|
|
HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile,
|
|
(void **) &pipfile);
|
|
|
|
hresult = pipfile->Load(lpszFileName, grfMode);
|
|
|
|
pipfile->Release();
|
|
|
|
if (FAILED(hresult))
|
|
{
|
|
// Make sure delegated too class liked what it got/
|
|
// BUGBUG: Can't just forward hresults!
|
|
return hresult;
|
|
}
|
|
|
|
// Create a file moniker. Cast to avoid const problem.
|
|
IMoniker *pmk;
|
|
hresult = CreateFileMoniker((LPOLESTR)lpszFileName, &pmk);
|
|
|
|
Win4Assert(SUCCEEDED(hresult)
|
|
&& "CAdvBnd::Load CreateFileMoniker failed");
|
|
|
|
// Get the running object table
|
|
IRunningObjectTable *prot;
|
|
|
|
hresult = GetRunningObjectTable(0, &prot);
|
|
|
|
Win4Assert(SUCCEEDED(hresult)
|
|
&& "CAdvBnd::Load GetRunningObjectTable failed");
|
|
|
|
// Register in the running object table
|
|
IUnknown *punk;
|
|
QueryInterface(IID_IUnknown, (void **) &punk);
|
|
hresult = prot->Register(0, punk, pmk, &_dwRegister);
|
|
|
|
Win4Assert(SUCCEEDED(hresult)
|
|
&& "CAdvBnd::Load Register failed");
|
|
|
|
// Set filetime to known value
|
|
FILETIME filetime;
|
|
memset(&filetime, 'B', sizeof(filetime));
|
|
|
|
// Set time to some known value
|
|
prot->NoteChangeTime(_dwRegister, &filetime);
|
|
|
|
// Release uneeded objects
|
|
pmk->Release();
|
|
prot->Release();
|
|
punk->Release();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBnd::Save
|
|
//
|
|
// Synopsis: IPeristFile interface - save
|
|
// does little but here for commentry
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDMETHODIMP CAdvBnd::Save(LPCOLESTR lpszFileName, BOOL fRemember)
|
|
{
|
|
Display(TEXT("CAdvBndCF::Save called\n"));
|
|
|
|
// Forward call to delegated class
|
|
IPersistFile *pipfile;
|
|
|
|
HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile,
|
|
(void **) &pipfile);
|
|
|
|
hresult = pipfile->Save(lpszFileName, fRemember);
|
|
|
|
pipfile->Release();
|
|
|
|
return hresult;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CAdvBnd::SaveCpmpleted
|
|
// CAdvBnd::GetCurFile
|
|
// CAdvBnd::IsDirty
|
|
//
|
|
// Synopsis: More IPeristFile interface methods
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDMETHODIMP CAdvBnd::SaveCompleted(LPCOLESTR lpszFileName)
|
|
{
|
|
Display(TEXT("CAdvBndCF::SaveCompleted called\n"));
|
|
|
|
// Forward call to delegated class
|
|
IPersistFile *pipfile;
|
|
|
|
HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile,
|
|
(void **) &pipfile);
|
|
|
|
hresult = pipfile->SaveCompleted(lpszFileName);
|
|
|
|
pipfile->Release();
|
|
|
|
return hresult;
|
|
}
|
|
|
|
STDMETHODIMP CAdvBnd::GetCurFile(LPOLESTR FAR *lpszFileName)
|
|
{
|
|
Display(TEXT("CAdvBndCF::GetCurFile called\n"));
|
|
|
|
// Forward call to delegated class
|
|
IPersistFile *pipfile;
|
|
|
|
HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile,
|
|
(void **) &pipfile);
|
|
|
|
hresult = pipfile->GetCurFile(lpszFileName);
|
|
|
|
pipfile->Release();
|
|
|
|
return hresult;
|
|
}
|
|
|
|
STDMETHODIMP CAdvBnd::IsDirty()
|
|
{
|
|
Display(TEXT("CAdvBndCF::IsDirty called\n"));
|
|
|
|
// Forward call to delegated class
|
|
IPersistFile *pipfile;
|
|
|
|
HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile,
|
|
(void **) &pipfile);
|
|
|
|
hresult = pipfile->IsDirty();
|
|
|
|
pipfile->Release();
|
|
|
|
return hresult;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Interface: IPersist
|
|
//
|
|
// Synopsis: IPersist interface methods
|
|
// Need to return a valid class id here
|
|
//
|
|
// History: 21-Nov-92 SarahJ Created
|
|
//
|
|
|
|
STDMETHODIMP CAdvBnd::GetClassID(LPCLSID classid)
|
|
{
|
|
Display(TEXT("CAdvBndCF::GetClassID called\n"));
|
|
|
|
*classid = CLSID_AdvBnd;
|
|
return S_OK;
|
|
}
|