Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

295 lines
8.6 KiB

// iextag.cpp : Implementation file for code common to all xtags..
// Note: Proxy/Stub Information
// To build a separate proxy/stub DLL,
// run nmake -f ccapsps.mk in the project directory.
#include <w95wraps.h>
#include "headers.h"
#pragma MARK_DATA(__FILE__)
#pragma MARK_CODE(__FILE__)
#pragma MARK_CONST(__FILE__)
#include "resource.h"
#include "initguid.h"
#include "iextag.h"
#include "peerfact.h"
#include "ccaps.h"
#include "homepg.h"
#include "download.h"
#ifndef __X_HTMLAREA_HXX_
#define __X_HTMLAREA_HXX_
#include "htmlarea.hxx"
#endif
#ifndef __X_SELECT_HXX_
#define __X_SELECT_HXX_
#include "select.hxx"
#endif
#ifndef __X_SELITEM_HXX_
#define __X_SELITEM_HXX_
#include "selitem.hxx"
#endif
#ifndef __X_COMBOBOX_HXX_
#define __X_COMBOBOX_HXX_
#include "combobox.hxx"
#endif
#ifndef __X_CHECKBOX_HXX_
#define __X_CHECKBOX_HXX_
#include "checkbox.hxx"
#endif
#ifndef __X_RADIO_HXX_
#define __X_RADIO_HXX_
#include "radio.hxx"
#endif
#ifndef __X_USERDATA_HXX_
#define __X_USERDATA_HXX_
#include "userdata.hxx"
#endif
#ifndef __X_RECTPEER_HXX_
#define __X_RECTPEER_HXX_
#include "rectpeer.hxx"
#endif
#ifndef __X_DEVICERECT_HXX_
#define __X_DEVICERECT_HXX_
#include "devicerect.hxx"
#endif
#ifndef __X_TMPPRINT_HXX_
#define __X_TMPPRINT_HXX_
#include "tmpprint.hxx"
#endif
#ifndef __X_HEADFOOT_HXX_
#define __X_HEADFOOT_HXX_
#include "headfoot.hxx"
#endif
#ifndef __X_SCROLLBAR_HXX_
#define __X_SCROLLBAR_HXX_
#include "scrllbar.hxx"
#endif
#ifndef __X_SPINBTTN_HXX_
#define __X_SPINBTTN_HXX_
#include "spinbttn.hxx"
#endif
#ifndef __X_SLIDEBAR_HXX_
#define __X_SLIDEBAR_HXX_
#include "slidebar.hxx"
#endif
#ifdef _ATL_STATIC_REGISTRY
#include <statreg.h>
#include <statreg.cpp>
#endif
#include <atlimpl.cpp>
#if 1
// this is according to IE5 bug 65301. (richards, alexz).
#if _MSC_VER < 1200
#pragma comment(linker, "/merge:.CRT=.data")
#endif
#endif
#include "shfusion.h"
CComModule _Module;
BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_PeerFactory, CPeerFactory)
OBJECT_ENTRY(CLSID_ClientCaps, CClientCaps)
OBJECT_ENTRY(CLSID_HomePage, CHomePage)
OBJECT_ENTRY(CLSID_CDownloadBehavior, CDownloadBehavior)
OBJECT_ENTRY(CLSID_CCombobox, CCombobox)
OBJECT_ENTRY(CLSID_CIESelectElement, CIESelectElement)
OBJECT_ENTRY(CLSID_CIEOptionElement, CIEOptionElement)
OBJECT_ENTRY(CLSID_CHtmlArea, CHtmlArea)
OBJECT_ENTRY(CLSID_CCheckBox, CCheckBox)
OBJECT_ENTRY(CLSID_CRadioButton, CRadioButton)
OBJECT_ENTRY(CLSID_CLayoutRect, CLayoutRect)
OBJECT_ENTRY(CLSID_CDeviceRect, CDeviceRect)
OBJECT_ENTRY(CLSID_CTemplatePrinter, CTemplatePrinter)
OBJECT_ENTRY(CLSID_CHeaderFooter, CHeaderFooter)
OBJECT_ENTRY(CLSID_CScrollBar, CScrollBar)
OBJECT_ENTRY(CLSID_CSpinButton, CSpinButton)
OBJECT_ENTRY(CLSID_CSliderBar, CSliderBar)
END_OBJECT_MAP()
HINSTANCE g_hInst = NULL;
BOOL g_fUnicodePlatform;
DWORD g_dwPlatformVersion; // (dwMajorVersion << 16) + (dwMinorVersion)
DWORD g_dwPlatformID; // VER_PLATFORM_WIN32S/WIN32_WINDOWS/WIN32_WINNT
DWORD g_dwPlatformBuild; // Build number
BOOL g_fUseShell32InsteadOfSHFolder;
// ISSUE: (alexz) find out why ATL leaks during registration and then remove usage of g_fDisableMemLeakReport
#if DBG == 1
BOOL g_fDisableMemLeakReport = FALSE;
#endif
/////////////////////////////////////////////////////////////////////////////
// DLL Entry Point
extern "C"
BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
SHFusionInitializeFromModule((HMODULE)hInstance);
OSVERSIONINFOA vi;
#ifdef UNIX // Unix setup program doesn't invoke COM. Needs to do it here.
CoInitialize(NULL);
#endif // Unix
vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
GetVersionExA(&vi);
g_dwPlatformVersion = (vi.dwMajorVersion << 16) + vi.dwMinorVersion;
g_dwPlatformID = vi.dwPlatformId;
g_dwPlatformBuild = vi.dwBuildNumber;
g_fUnicodePlatform = ( g_dwPlatformID == VER_PLATFORM_WIN32_NT );
// || vi.dwPlatformId == VER_PLATFORM_WIN32_UNIX);
// NOTE: On Millennium or W2k we should use Shell32 for
// SHGetFolderPath instead of SHFolder.
g_fUseShell32InsteadOfSHFolder = (VER_PLATFORM_WIN32_WINDOWS == g_dwPlatformID
&& (g_dwPlatformVersion >= 0x0004005a))
|| (VER_PLATFORM_WIN32_NT == g_dwPlatformID
&& g_dwPlatformVersion >= 0x00050000);
g_hInst = (HINSTANCE)hInstance;
_Module.Init(ObjectMap, (HINSTANCE)hInstance);
DisableThreadLibraryCalls((HINSTANCE)hInstance);
CPersistUserData::GlobalInit();
#ifdef UNIX
CoUninitialize();
#endif // Unix
}
break;
case DLL_PROCESS_DETACH:
CPersistUserData::GlobalUninit();
_Module.Term();
#if DBG == 1
#ifndef UNIX // UNIX doesn't have _CrtDumpMemoryLeaks yet.
if (!g_fDisableMemLeakReport && _CrtDumpMemoryLeaks())
{
if (IDYES == MessageBoxA (
NULL,
"MEMORY LEAKS DETECTED\r\n\r\n"
"Break for instructions how to track the leaks?",
"IEPEERS.DLL",
MB_YESNO | MB_SETFOREGROUND))
{
DebugBreak();
//
// How to track the leaks:
//
// Step 1. Look for trace of memory leaks in debug output window, e.g.:
//
// Dumping objects ->
// ...
// {42} normal block at 0x01A00CC0, 226 bytes long.
// Data: <m o n k e y w > 6D 00 6F 00 6E 00 6B 00 65 00 79 00 20 00 77 00
// ...
//
// interesting info: block with serial number 42 leaked
//
// Step 2. Set breakpoint inside debug allocator on block number 42 using one of the
// following methods:
// - set break point in DLL_PROCESS_ATTACH case above, go to QuickWatch window,
// and evaluate expression "_CrtSetBreakAlloc(42)"; or
// - set break point in DLL_PROCESS_ATTACH case above, and set variable _crtBreakAlloc
// global debug variable to 42; or
// - place a call "_CrtSetBreakAlloc(42)" in DLL_PROCESS_ATTACH case above,
// recompile and run.
}
}
#endif // UNIX
#endif
SHFusionUninitialize();
break;
}
return TRUE; // ok
}
/////////////////////////////////////////////////////////////////////////////
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _Module.GetClassObject(rclsid, riid, ppv);
}
/////////////////////////////////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
#if DBG == 1
g_fDisableMemLeakReport = TRUE;
#endif
// registers object, typelib and all interfaces in typelib
HRESULT hr = _Module.RegisterServer(TRUE);
return hr;
}
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
#if DBG == 1
g_fDisableMemLeakReport = TRUE;
#endif
_Module.UnregisterServer();
return S_OK;
}
STDAPI DllEnumClassObjects(int i, CLSID *pclsid, IUnknown **ppUnk)
{
if (i >= (sizeof(ObjectMap)/sizeof(ObjectMap[0])) - 1)
{
return S_FALSE;
}
*pclsid = *(ObjectMap[i].pclsid);
return _Module.GetClassObject(*pclsid, IID_IUnknown, (LPVOID*)ppUnk);
}