|
|
// --------------------------------------------------------------------------------
// Dllmain.cpp
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// Steven J. Bailey
// --------------------------------------------------------------------------------
#include "pch.hxx"
#include <shfusion.h>
#define DEFINE_STRING_CONSTANTS
#include "strconst.h"
#include "dllmain.h"
#include "demand.h"
#include "shared.h"
// --------------------------------------------------------------------------------
// Globals - Object count and lock count
// --------------------------------------------------------------------------------
HINSTANCE g_hInst=NULL; HINSTANCE g_hInstRes=NULL; LONG g_cRef=0; LONG g_cLock=0; CRITICAL_SECTION g_csDllMain={0}; CRITICAL_SECTION g_csAcctMan={0}; BOOL g_fAttached = FALSE; CAccountManager *g_pAcctMan=NULL; IMalloc *g_pMalloc=NULL; BOOL g_fCachedGUID=FALSE; GUID g_guidCached; SYSTEM_INFO g_SystemInfo={0}; OSVERSIONINFO g_OSInfo={0};
#ifdef DEBUG
DWORD dwDOUTLevel; DWORD dwDOUTLMod; DWORD dwDOUTLModLevel; #endif
inline BOOL fIsNT5() { return((g_OSInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) && (g_OSInfo.dwMajorVersion >= 5)); }
void InitDemandMimeole(void); void FreeDemandMimeOle(void);
// --------------------------------------------------------------------------------
// GetDllMajorVersion
// --------------------------------------------------------------------------------
OEDLLVERSION WINAPI GetDllMajorVersion(void) { return OEDLL_VERSION_CURRENT; }
// --------------------------------------------------------------------------------
// Dll Entry Point
// --------------------------------------------------------------------------------
EXTERN_C BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) { // Handle Attach - detach reason
switch (dwReason) { case DLL_PROCESS_ATTACH: SHFusionInitialize(NULL); g_hInst = hInst;
CoGetMalloc(1, &g_pMalloc); InitializeCriticalSection(&g_csAcctMan); InitializeCriticalSection(&g_csDllMain); g_fAttached = TRUE; InitDemandLoadedLibs();
InitDemandMimeole();
DisableThreadLibraryCalls(hInst);
// Get System & OS Info
GetPCAndOSTypes(&g_SystemInfo, &g_OSInfo);
// Get Resources from Lang DLL
g_hInstRes = LoadLangDll(g_hInst, c_szAcctResDll, fIsNT5()); if(g_hInstRes == NULL) { Assert(FALSE); return FALSE; }
#ifdef DEBUG
dwDOUTLevel=GetPrivateProfileInt("Debug", "ICLevel", 0, "athena.ini"); dwDOUTLMod=GetPrivateProfileInt("Debug", "Mod", 0, "athena.ini"); dwDOUTLModLevel=GetPrivateProfileInt("Debug", "ModLevel", 0, "athena.ini"); #endif
break;
case DLL_PROCESS_DETACH: FreeDemandLoadedLibs();
FreeDemandMimeOle();
SafeFreeLibrary(g_hInstRes); g_fAttached = FALSE; DeleteCriticalSection(&g_csAcctMan); DeleteCriticalSection(&g_csDllMain); // Don't release anything but g_pMalloc here or suffer at the hands of kernel
SafeRelease(g_pMalloc); SHFusionUninitialize(); break; }
// Done
return TRUE; }
// --------------------------------------------------------------------------------
// DllAddRef
// --------------------------------------------------------------------------------
ULONG DllAddRef(void) { return (ULONG)InterlockedIncrement(&g_cRef); }
// --------------------------------------------------------------------------------
// DllRelease
// --------------------------------------------------------------------------------
ULONG DllRelease(void) { return (ULONG)InterlockedDecrement(&g_cRef); }
// --------------------------------------------------------------------------------
// DllCanUnloadNow
// --------------------------------------------------------------------------------
STDAPI DllCanUnloadNow(void) { HRESULT hr = S_OK; if(!g_fAttached) // critacal sections was deleted (or not created): we defently can be unloaded
return S_OK;
EnterCriticalSection(&g_csDllMain); // DebugTrace("DllCanUnloadNow: %s - Reference Count: %d, LockServer Count: %d\n", __FILE__, g_cRef, g_cLock);
hr = (0 == g_cRef && 0 == g_cLock) ? S_OK : S_FALSE; LeaveCriticalSection(&g_csDllMain); return hr; }
// --------------------------------------------------------------------------------
// DllRegisterServer
// --------------------------------------------------------------------------------
STDAPI DllRegisterServer(void) { HRESULT hr;
// Trace This
DebugTrace("MSOEACCT.DLL: DllRegisterServer called\n");
// Register my self
hr = CallRegInstall(g_hInst, g_hInst, c_szReg, NULL);
#if !defined(NOHTTPMAIL)
// Register HTTPMAIL Domains in InternetDomains
if (SUCCEEDED(hr)) hr = CallRegInstall(g_hInst, g_hInst, c_szRegHTTPDomains, NULL); #endif
return(hr); }
// --------------------------------------------------------------------------------
// DllUnregisterServer
// --------------------------------------------------------------------------------
STDAPI DllUnregisterServer(void) { HRESULT hr;
// Trace This
DebugTrace("MSOEACCT.DLL: DllUnregisterServer called\n");
hr = CallRegInstall(g_hInst, g_hInst, c_szUnReg, NULL);
return(hr); }
|