|
|
/*
* targetdll.cxx * * * Copyright (c) 1998-1999 Microsoft Corporation * * PURPOSE: Implements the DLL entry points. * * * OWNER: ptousig */ #ifndef _SNAPINLIST_FILE
#error _SNAPINLIST_FILE not defined
#endif
#ifndef _FREGISTERTYPELIB
#define _FREGISTERTYPELIB TRUE // define this equal to FALSE to avoid registering the typelib.
#endif //_FREGISTERTYPELIB
#ifndef SNAPIN_COM_OBJECTS
#define SNAPIN_COM_OBJECTS
#endif
extern "C" { BOOL WINAPI _CRT_INIT( HANDLE hInstance, DWORD nReason, LPVOID pReserved ); }
#define DECLARE_SNAPIN(_snapin) \
template CComponentDataTemplate<_snapin, CComponent, &CLSID_ComponentData_##_snapin>; \ typedef CComponentDataTemplate<_snapin, CComponent, &CLSID_ComponentData_##_snapin> t_ComponentData_##_snapin; \ typedef CSnapinAboutTemplate<_snapin, &CLSID_SnapinAbout_##_snapin> t_SnapinAbout_##_snapin;
#include _SNAPINLIST_FILE
// Declare the ATL COM object map.
BEGIN_OBJECT_MAP(ObjectMap)
#define DECLARE_SNAPIN(_snapin) \
OBJECT_ENTRY(CLSID_ComponentData_##_snapin, t_ComponentData_##_snapin) \ OBJECT_ENTRY(CLSID_SnapinAbout_##_snapin, t_SnapinAbout_##_snapin) \
#include _SNAPINLIST_FILE
SNAPIN_COM_OBJECTS END_OBJECT_MAP()
/////////////////////////////////////////////////////////////////////////////
// DLL Entry Point
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { SC sc;
CBaseFrame::s_hinst = hInstance;
if (dwReason == DLL_PROCESS_ATTACH) { //
// since _CRT_INIT will create global variables/objects we must make sure
// that it is called before we initialize ourselves.
//
if (!_CRT_INIT(hInstance, dwReason, lpReserved )) { sc = ScFromWin32(::GetLastError()); goto Error; }
CMMCFrame::Initialize(hInstance, NULL, NULL, SW_RESTORE); _Module.Init(ObjectMap, hInstance); DisableThreadLibraryCalls(hInstance); } else if (dwReason == DLL_PROCESS_DETACH) { _Module.Term(); CMMCFrame::Uninitialize();
//
// since _CRT_INIT will destroy global variables/objects we must make sure
// that it is called after we have unitialized ourselves.
//
if (!_CRT_INIT(hInstance, dwReason, lpReserved )) { sc = ScFromWin32(::GetLastError()); goto Error; } } else if (!_CRT_INIT(hInstance, dwReason, lpReserved )) { sc = ScFromWin32(::GetLastError()); goto Error; }
return TRUE; // ok
Error: MMCErrorBox(sc); return FALSE; }
/////////////////////////////////////////////////////////////////////////////
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void) { CMMCFrame::Initialize(); 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) { CMMCFrame::Initialize(); return _Module.GetClassObject(rclsid, riid, ppv); }
HRESULT RegisterSnapins(BOOL fRegister) { HRESULT hr = S_OK;
// Register/unregister all snapins.
BEGIN_SNAPIN_MAP() #define DECLARE_SNAPIN(_snapin) SNAPIN_ENTRY(t_ComponentData_##_snapin, fRegister)
#include _SNAPINLIST_FILE
END_SNAPIN_MAP()
return hr; }
/////////////////////////////////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void) { HRESULT hr = S_OK; CMMCFrame::Initialize(); hr = RegisterSnapins(TRUE); // registers all snap-ins.
if (FAILED(hr)) goto Error; hr = _Module.RegisterServer(_FREGISTERTYPELIB); // registers object, typelib and all interfaces in typelib
if (hr) goto Error; CMMCFrame::Uninitialize(); // hack to avoid a multithreaded uninit in DllMain
Cleanup: return hr; Error: goto Cleanup; }
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void) { HRESULT hr = S_OK; CMMCFrame::Initialize(); hr = RegisterSnapins(FALSE); // unregisters all snap-ins.
if (FAILED(hr)) goto Error; hr = _Module.UnregisterServer();// does not delete the registry keys.
if (FAILED(hr)) goto Error; CMMCFrame::Uninitialize(); // hack to avoid a multithreaded uninit in DllMain
Cleanup: return hr; Error: goto Cleanup; }
|