windows-nt/Source/XPSP1/NT/com/oleutest/simpsvr/icf.cpp
2020-09-26 16:20:57 +08:00

229 lines
5.1 KiB
C++

//**********************************************************************
// File name: ICF.CPP
//
// Implementation file for the CClassFactory Class
//
// Functions:
//
// See icf.h for a list of member functions.
//
// Copyright (c) 1993 Microsoft Corporation. All rights reserved.
//**********************************************************************
#include "pre.h"
#include "app.h"
#include "doc.h"
#include "icf.h"
//**********************************************************************
//
// CClassFactory::QueryInterface
//
// Purpose:
// Used for interface negotiation
//
// Parameters:
//
// REFIID riid - Interface being queried for.
//
// LPVOID FAR *ppvObj - Out pointer for the interface.
//
// Return Value:
//
// S_OK - Success
// E_NOINTERFACE - Failure
//
// Function Calls:
// Function Location
//
// CClassFactory::AddRef ICF.CPP
//
//********************************************************************
STDMETHODIMP CClassFactory::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
{
TestDebugOut(TEXT("In CClassFactory::QueryInterface\r\n"));
SCODE sc = S_OK;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_IClassFactory) )
*ppvObj = this;
else
{
*ppvObj = NULL;
sc = E_NOINTERFACE;
}
if (*ppvObj)
((LPUNKNOWN)*ppvObj)->AddRef();
// pass it on to the Application object
return ResultFromScode(sc);
}
//**********************************************************************
//
// CClassFactory::AddRef
//
// Purpose:
//
// Increments the reference count on CClassFactory and the application
// object.
//
// Parameters:
//
// None
//
// Return Value:
//
// The Reference count on CClassFactory
//
// Function Calls:
// Function Location
//
// OuputDebugString Windows API
//
//********************************************************************
STDMETHODIMP_(ULONG) CClassFactory::AddRef ()
{
TestDebugOut(TEXT("In CClassFactory::AddRef\r\n"));
return ++m_nCount;
}
//**********************************************************************
//
// CClassFactory::Release
//
// Purpose:
//
// Decrements the reference count of CClassFactory and the
// application object.
//
// Parameters:
//
// None
//
// Return Value:
//
// The new reference count
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
//
//********************************************************************
STDMETHODIMP_(ULONG) CClassFactory::Release ()
{
TestDebugOut(TEXT("In CClassFactory::Release\r\n"));
if (--m_nCount== 0)
{
delete this;
return(0);
}
return m_nCount;
}
//**********************************************************************
//
// CClassFactory::CreateInstance
//
// Purpose:
//
// Instantiates a new OLE object
//
// Parameters:
//
// LPUNKNOWN pUnkOuter - Pointer to the controlling unknown
//
// REFIID riid - The interface type to fill in ppvObject
//
// LPVOID FAR* ppvObject - Out pointer for the object
//
// Return Value:
//
// S_OK - Creation was successful
// CLASS_E_NOAGGREGATION - Tried to be created as part of an aggregate
//
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrDoc::CreateObject DOC.CPP
//
//********************************************************************
STDMETHODIMP CClassFactory::CreateInstance ( LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID FAR* ppvObject)
{
HRESULT hErr;
TestDebugOut(TEXT("In CClassFactory::CreateInstance\r\n"));
// need to NULL the out parameter
*ppvObject = NULL;
// we don't support aggregation...
if (pUnkOuter)
{
hErr = ResultFromScode(CLASS_E_NOAGGREGATION);
goto error;
}
hErr = m_lpApp->m_lpDoc->CreateObject(riid, ppvObject);
error:
return hErr;
}
//**********************************************************************
//
// CClassFactory::LockServer
//
// Purpose:
// To lock the server and keep an open object application in memory
//
// Parameters:
//
// BOOL fLock - TRUE to lock the server, FALSE to unlock it
//
// Return Value:
//
// S_OK
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CoLockObjectExternal OLE API
// ResultFromScode OLE API
//
//
//********************************************************************
STDMETHODIMP CClassFactory::LockServer ( BOOL fLock)
{
HRESULT hRes;
TestDebugOut(TEXT("In CClassFactory::LockServer\r\n"));
if ((hRes=CoLockObjectExternal(m_lpApp, fLock, TRUE)) != S_OK)
{
TestDebugOut(TEXT("CClassFactory::LockServer \
CoLockObjectExternal fails\n"));
return(hRes);
}
return ResultFromScode( S_OK);
}