windows-nt/Source/XPSP1/NT/shell/ext/inetfind/fndcf.c

138 lines
3.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*****************************************************************************
*
* fndcf.c - IClassFactory interface
*
*****************************************************************************/
#include "fnd.h"
/*****************************************************************************
*
* The sqiffle for this file.
*
*****************************************************************************/
#define sqfl sqflFactory
/*****************************************************************************
*
* Declare the interfaces we will be providing.
*
*****************************************************************************/
Primary_Interface(CFndFactory, IClassFactory);
/*****************************************************************************
*
* CFndFactory
*
* Really nothing doing.
*
*****************************************************************************/
typedef struct CFndFactory {
/* Supported interfaces */
IClassFactory cf;
} CFndFactory, FCF, *PFCF;
typedef IClassFactory CF, *PCF;
/*****************************************************************************
*
* CFndFactory_QueryInterface (from IUnknown)
* CFndFactory_AddRef (from IUnknown)
* CFndFactory_Finalize (from Common)
* CFndFactory_Release (from IUnknown)
*
*****************************************************************************/
#ifdef DEBUG
Default_QueryInterface(CFndFactory)
Default_AddRef(CFndFactory)
Default_Release(CFndFactory)
#else
#define CFndFactory_QueryInterface Common_QueryInterface
#define CFndFactory_AddRef Common_AddRef
#define CFndFactory_Release Common_Release
#endif
#define CFndFactory_Finalize Common_Finalize
/*****************************************************************************
*
* CFndFactory_CreateInstance (from IClassFactory)
*
*****************************************************************************/
STDMETHODIMP
CFndFactory_CreateInstance(PCF pcf, LPUNKNOWN punkOuter, RIID riid, PPV ppvObj)
{
HRESULT hres;
SquirtSqflPtszV(sqfl, TEXT("CFndFactory_CreateInstance()"));
if (!punkOuter) {
/* The only object we know how to create is a context menu */
hres = CFndCm_New(riid, ppvObj);
} else { /* Does anybody support aggregation any more? */
hres = ResultFromScode(CLASS_E_NOAGGREGATION);
}
SquirtSqflPtszV(sqfl, TEXT("CFndFactory_CreateInstance() -> %08x [%08x]"),
hres, *ppvObj);
return hres;
}
/*****************************************************************************
*
* CFndFactory_LockServer (from IClassFactory)
*
* Locking the server is identical to
* creating an object and not releasing it until you want to unlock
* the server.
*
*****************************************************************************/
STDMETHODIMP
CFndFactory_LockServer(PCF pcf, BOOL fLock)
{
PFCF this = IToClass(CFndFactory, cf, pcf);
if (fLock) {
InterlockedIncrement((LPLONG)&g_cRef);
} else {
InterlockedDecrement((LPLONG)&g_cRef);
}
return NOERROR;
}
/*****************************************************************************
*
* CFndFactory_New
*
*****************************************************************************/
STDMETHODIMP
CFndFactory_New(RIID riid, PPV ppvObj)
{
HRESULT hres;
if (IsEqualIID(riid, &IID_IClassFactory)) {
hres = Common_New(CFndFactory, ppvObj);
} else {
hres = ResultFromScode(E_NOINTERFACE);
}
return hres;
}
/*****************************************************************************
*
* The long-awaited vtbl
*
*****************************************************************************/
#pragma BEGIN_CONST_DATA
Primary_Interface_Begin(CFndFactory, IClassFactory)
CFndFactory_CreateInstance,
CFndFactory_LockServer,
Primary_Interface_End(CFndFactory, IClassFactory)