LIBMAIN.CPP

/*++ 

Copyright (c) 1996 Microsoft Corporation

Module Name:

LibMain.cpp

Abstract:

LibMain for ADsSmp.dll

Author:

Environment:

User mode

Revision History :

--*/
#include "adssmp.h"
#pragma hdrstop


// Globals
HINSTANCE g_hInst = NULL;

ULONG g_ulObjCount = 0L; // Number of objects alive in adssmp.dll
ULONG g_ulLockCount = 0L; // Number of server locks on adssmp.dll


//+------------------------------------------------------------------------
//
// Macro that calculates the number of elements in a statically-defined
// array.
//-------------------------------------------------------------------------
#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof(_a[0]))

//+------------------------------------------------------------------------
// Create static Namespace and Provider class factory objects
//-------------------------------------------------------------------------
CSampleDSProviderCF g_cfProvider;
CSampleDSNamespaceCF g_cfNamespace;


//+------------------------------------------------------------------------
//
// ads class factory lookup table
//
//-------------------------------------------------------------------------

struct CLSTABLE
{
const CLSID * pclsid;
IClassFactory * pCF;
};



CLSTABLE g_aclscache[] =
{
&CLSID_SampleDSProvider, &g_cfProvider,
&CLSID_SampleDSNamespace, &g_cfNamespace,
};


//+---------------------------------------------------------------
//
// Function: DllGetClassObject
//
// Synopsis: Standard DLL entrypoint for locating class factories
//
//----------------------------------------------------------------

STDAPI
DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID FAR* ppv)
{
HRESULT hr;
size_t i;

for (i = 0; i < ARRAY_SIZE(g_aclscache); i++)
{
if (IsEqualCLSID(clsid, *g_aclscache[i].pclsid))
{
hr = g_aclscache[i].pCF->QueryInterface(iid, ppv);
RRETURN(hr);
}
}

*ppv = NULL;

return E_NOINTERFACE;
}

//+---------------------------------------------------------------
//
// Function: DllCanUnloadNow
//
// Synopsis: Standard DLL entrypoint to determine if DLL can be unloaded
//
//---------------------------------------------------------------

STDAPI DllCanUnloadNow(void) {
if (0L==g_ulObjCount && 0L==g_ulLockCount) return ResultFromScode(S_OK);
else return ResultFromScode(S_FALSE);
}

//+---------------------------------------------------------------
//
// Function: DllMain
//
// Synopsis: Standard DLL initialization entrypoint
//
//---------------------------------------------------------------

BOOL WINAPI
LibMain(HINSTANCE hInst, DWORD dwReason, LPVOID pvReserved)
{

// Check our compatibility with the OLE runtime.
// We are compatible with any later major version,
// or the same major version with equal or greater minor version.
if (!IsCompatibleOleVersion(OLE_MAJ_VER, OLE_MIN_VER))
{
return FALSE;
}

switch (dwReason){
case DLL_PROCESS_ATTACH:

g_hInst = hInst;
break;


case DLL_PROCESS_DETACH:


default:
break;
}

return TRUE;
}

BOOL
IsCompatibleOleVersion(WORD wMaj, WORD wMin)
{
// Check our compatibility with the OLE runtime.
// We are compatible with any later major version,
// or the same major version with equal or greater minor version.
DWORD ov = OleBuildVersion();
return HIWORD(ov) > wMaj || (HIWORD(ov) == wMaj && LOWORD(ov) >= wMin);
}



//+---------------------------------------------------------------------------
//
// Function: DllMain
//
// Synopsis: entry point for NT - post .546
//
//----------------------------------------------------------------------------
EXTERN_C BOOL WINAPI
DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{
return LibMain((HINSTANCE)hDll, dwReason, lpReserved);
}