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

236 lines
4.7 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:
//
//
// 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
//
// CSimpSvrApp::QueryInterface APP.CPP
//
// Comments:
//
//
//********************************************************************
STDMETHODIMP CClassFactory::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
{
TestDebugOut("In CClassFactory::QueryInterface\r\n");
SCODE sc = S_OK;
if ( (riid == IID_IUnknown) ||
(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
//
// Comments:
//
//
//********************************************************************
STDMETHODIMP_(ULONG) CClassFactory::AddRef ()
{
TestDebugOut("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
//
// Comments:
//
//
//********************************************************************
STDMETHODIMP_(ULONG) CClassFactory::Release ()
{
TestDebugOut("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
//
// Comments:
//
//
//********************************************************************
STDMETHODIMP CClassFactory::CreateInstance ( LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID FAR* ppvObject)
{
HRESULT hErr;
TestDebugOut("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:
//
//
// 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
//
// Comments:
//
//
//********************************************************************
STDMETHODIMP CClassFactory::LockServer ( BOOL fLock)
{
TestDebugOut("In CClassFactory::LockServer\r\n");
CoLockObjectExternal(m_lpApp, fLock, TRUE);
return ResultFromScode( S_OK);
};