|
|
//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1995 **
//*********************************************************************
//
// INIT.C - Initialization code for Internet control panel
//
// HISTORY:
//
// 4/3/95 jeremys Created.
//
#include "inetcplp.h"
// external calls and defs
#include <inetcpl.h>
#define MLUI_INIT
#include <mluisupp.h>
//
// Downlevel delay load support (we forward to shlwapi)
//
#include <delayimp.h>
PfnDliHook __pfnDliFailureHook;
HINSTANCE ghInstance=NULL;
extern HMODULE hOLE32; DWORD g_dwtlsSecInitFlags; BOOL g_bMirroredOS = FALSE; HMODULE g_hOleAcc; BOOL g_fAttemptedOleAccLoad = FALSE;
STDAPI_(BOOL) LaunchInternetControlPanelAtPage(HWND hDlg, UINT nStartPage); BOOL IsCompatModeProcess(void);
void SetupDelayloadErrorHandler() { __pfnDliFailureHook = (PfnDliHook)GetProcAddress(GetModuleHandleA("shlwapi.dll"), "DelayLoadFailureHook"); }
/*******************************************************************
NAME: DllEntryPoint
SYNOPSIS: Entry point for DLL.
********************************************************************/ STDAPI_(BOOL) DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpReserved) { if( fdwReason == DLL_PROCESS_ATTACH ) { SHFusionInitializeFromModule(hInstDll); SetupDelayloadErrorHandler();
if (IsCompatModeProcess()) // Fail loading in compat mode process
return 0; ghInstance = hInstDll; MLLoadResources(ghInstance, TEXT("inetcplc.dll")); #ifndef REPLACE_PROPSHEET_TEMPLATE
InitMUILanguage(INETCPL_GetUILanguage()); #endif
#ifdef DEBUG
CcshellGetDebugFlags(); #endif
// Thread local storage used in security.cpp
g_dwtlsSecInitFlags = TlsAlloc(); g_bMirroredOS = IS_MIRRORING_ENABLED(); TlsSetValue(g_dwtlsSecInitFlags, (void *) new SECURITYINITFLAGS);
} else if (fdwReason == DLL_PROCESS_DETACH) { MLFreeResources(ghInstance);
if (g_hwndUpdate) { // we've got this subclassed.
// if it's still valid as we leave, we need
// to destroy it so that it doesn't fault trying to access our info
DestroyWindow(g_hwndUpdate); } if(hOLE32) { FreeLibrary(hOLE32); hOLE32 = NULL;
}
if (g_hOleAcc) { FreeLibrary(g_hOleAcc); g_hOleAcc = NULL; g_fAttemptedOleAccLoad = FALSE; }
// free tls used in security.cpp
if(g_dwtlsSecInitFlags != (DWORD) -1) { SECURITYINITFLAGS * psif = NULL; psif = (SECURITYINITFLAGS *) TlsGetValue(g_dwtlsSecInitFlags); if(psif) { delete psif; psif = NULL; } TlsFree(g_dwtlsSecInitFlags); } SHFusionUninitialize(); } return TRUE; }
BOOL RunningOnNT() { return !(::GetVersion() & 0x80000000); }
/*******************************************************************
NAME: CPlApplet
SYNOPSIS: Entry point for control panel.
********************************************************************/ STDAPI_(LRESULT) CPlApplet // Control panel applet procedure
( HWND hwndCpl, // Control panel parent window
UINT uMsg, // message
LPARAM lParam1, // value depends on message
LPARAM lParam2 // value depends on message
) {
LPNEWCPLINFO lpNewCplInfo = (LPNEWCPLINFO) lParam2; LPCPLINFO lpCplInfo = (LPCPLINFO) lParam2; DWORD dwNIcons;
switch (uMsg) { case CPL_INIT: // Initialization message from Control Panel
return TRUE;
case CPL_GETCOUNT: /* We always have the main internet CPL icon; on Win95 platforms,
* we also have the Users icon if mslocusr.dll is present. */ dwNIcons = 1; if (!RunningOnNT()) { TCHAR szPath[MAX_PATH];
// check if mslocusr.dll is present in the system dir
if (GetSystemDirectory(szPath, ARRAYSIZE(szPath))) { PathAppend(szPath, TEXT("mslocusr.dll")); if (PathFileExists(szPath)) dwNIcons++; } } return dwNIcons;
case CPL_INQUIRE: /* CPL #0 is the main Internet CPL, #1 (the only other one we'll ever
* be asked about) is the Users CPL. */ if (!lParam1) { lpCplInfo->idIcon = IDI_INTERNET; lpCplInfo->idName = IDS_INTERNET; lpCplInfo->idInfo = IDS_DESCRIPTION; lpCplInfo->lData = 0; } else { lpCplInfo->idIcon = IDI_USERS; lpCplInfo->idName = IDS_USERS; lpCplInfo->idInfo = IDS_USERS_DESCRIPTION; lpCplInfo->lData = 0; } return FALSE;
case CPL_NEWINQUIRE:
// Return new-style info structure for Control Panel
// By not responding to NEWINQUIRE, Win95 will not preload our
// .cpl file; by extension, since we are statically linked to MSHTML's
// import library, MSHTML will also not be loaded. If we respond to
// this, then our cpl and MSHTML (>600k) are both loaded when the
// control panel is just open. (IE, they will be loaded even if the
// user has not selected to invoke our specific cpl applet.
return TRUE; // TRUE == we are NOT responding to this
break;
case CPL_DBLCLK:
//
// This means the user did not specify a particular page
//
lParam2 = 0;
// fall through
case CPL_STARTWPARMSA: case CPL_STARTWPARMSW:
/* CPL #0 is the main Internet CPL, #1 (the only other one we'll ever
* be asked about) is the Users CPL. The Users CPL is loaded from * mslocusr.dll dynamically. The entrypoint is structured as a * rundll32 entrypoint. */ if (!lParam1) { //
// If lParam2!=NULL, then the user specified a page on the command line
//
if (lParam2) { UINT nPage; if (CPL_STARTWPARMSA == uMsg) nPage = StrToIntA((LPSTR)lParam2); else nPage = StrToIntW((LPWSTR)lParam2);
LaunchInternetControlPanelAtPage(hwndCpl, nPage); }
//
// Otherwise request the default page
//
else LaunchInternetControlPanelAtPage(hwndCpl,DEFAULT_CPL_PAGE);
} else { HINSTANCE hinstMSLU = LoadLibrary(TEXT("mslocusr.dll")); if (hinstMSLU != NULL) { typedef void (*PFNRUNDLL)(HWND hwndParent, HINSTANCE hinstEXE, LPSTR pszCmdLine, int nCmdShow); PFNRUNDLL pfn = (PFNRUNDLL)GetProcAddress(hinstMSLU, "UserCPL"); if (pfn != NULL) { (*pfn)(hwndCpl, NULL, "", SW_SHOW); } FreeLibrary(hinstMSLU); } } return TRUE;
case CPL_EXIT: // Control Panel is exiting
break;
default: break; }
return 0L; }
|