windows-nt/Source/XPSP1/NT/shell/ext/ratings/msrating/msrating.cpp
2020-09-26 16:20:57 +08:00

130 lines
2.6 KiB
C++

#include "msrating.h"
/* the following defs will make msluglob.h actually define globals */
#define EXTERN
#define ASSIGN(value) = value
#include "msluglob.h"
#include "ratings.h"
#define DECL_CRTFREE
#include <crtfree.h>
HANDLE g_hmtxShell = 0; // for critical sections
HANDLE g_hsemStateCounter = 0; //
#ifdef DEBUG
BOOL g_fCritical=FALSE;
#endif
HINSTANCE g_hInstance = NULL;
long g_cRefThisDll = 0; // Reference count of this DLL.
long g_cLocks = 0; // Number of locks on this server.
BOOL g_bMirroredOS = FALSE;
CComModule _Module;
// #define CLSID_MSRating szRORSGUID
// BEGIN_OBJECT_MAP(ObjectMap)
// OBJECT_ENTRY(CLSID_MSRating, CMSRating)
// END_OBJECT_MAP()
void LockThisDLL(BOOL fLock)
{
if (fLock)
InterlockedIncrement(&g_cLocks);
else
InterlockedDecrement(&g_cLocks);
}
void RefThisDLL(BOOL fRef)
{
if (fRef)
InterlockedIncrement(&g_cRefThisDll);
else
InterlockedDecrement(&g_cRefThisDll);
}
void Netlib_EnterCriticalSection(void)
{
WaitForSingleObject(g_hmtxShell, INFINITE);
#ifdef DEBUG
g_fCritical=TRUE;
#endif
}
void Netlib_LeaveCriticalSection(void)
{
#ifdef DEBUG
g_fCritical=FALSE;
#endif
ReleaseMutex(g_hmtxShell);
}
#include <shlwapip.h>
#include <mluisupp.h>
void _ProcessAttach()
{
::DisableThreadLibraryCalls(::g_hInstance);
MLLoadResources(::g_hInstance, TEXT("msratelc.dll"));
InitMUILanguage( MLGetUILanguage() );
// Override the Module Resources Handle.
_Module.m_hInstResource = MLGetHinst();
g_hmtxShell = CreateMutex(NULL, FALSE, TEXT("MSRatingMutex")); // per-instance
g_hsemStateCounter = CreateSemaphore(NULL, 0, 0x7FFFFFFF, "MSRatingCounter");
g_bMirroredOS = IS_MIRRORING_ENABLED();
::InitStringLibrary();
RatingInit();
}
void _ProcessDetach()
{
MLFreeResources(::g_hInstance);
// Clear the Module Resources Handle.
_Module.m_hInstResource = NULL;
RatingTerm();
CleanupWinINet();
CleanupRatingHelpers(); /* important, must do this before CleanupOLE() */
CleanupOLE();
CloseHandle(g_hmtxShell);
CloseHandle(g_hsemStateCounter);
}
STDAPI_(BOOL) DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID reserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
_Module.Init( NULL, hInstDll );
SHFusionInitializeFromModule(hInstDll);
g_hInstance = hInstDll;
_ProcessAttach();
}
else if (fdwReason == DLL_PROCESS_DETACH)
{
_ProcessDetach();
SHFusionUninitialize();
_Module.Term();
}
return TRUE;
}