windows-nt/Source/XPSP1/NT/admin/activec/test/snapins/inc/targetdll.cxx
2020-09-26 16:20:57 +08:00

175 lines
4.9 KiB
C++

/*
* 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;
}