//
// init.cpp
//

#include "private.h"
#include "globals.h"
#include "immxutil.h"
#include "mui.h"

extern void ReleaseDelayedLibs();

//+---------------------------------------------------------------------------
//
// DllInit
//
// Called on our first CoCreate.  Use this function to do initialization that
// would be unsafe during process attach, like anything requiring a LoadLibrary.
//
//----------------------------------------------------------------------------
BOOL DllInit(void)
{
    BOOL fRet = TRUE;

    CicEnterCriticalSection(GetServerCritSec());

    if (DllRefCount() != 1)
        goto Exit;

    fRet = TFInitLib_PrivateForCiceroOnly(Internal_CoCreateInstance);

Exit:
    CicLeaveCriticalSection(GetServerCritSec());

    return fRet;
}

//+---------------------------------------------------------------------------
//
// DllUninit
//
// Called after the dll ref count drops to zero.  Use this function to do
// uninitialization that would be unsafe during process detach, like
// FreeLibrary calls, COM Releases, or mutexing.
//
//----------------------------------------------------------------------------

void DllUninit(void)
{
    CicEnterCriticalSection(GetServerCritSec());

    if (DllRefCount() != 0)
        goto Exit;

    TFUninitLib();
    ReleaseDelayedLibs();
    MuiFlushDlls(g_hInst);

Exit:
    CicLeaveCriticalSection(GetServerCritSec());
}