227 lines
6 KiB
C++
227 lines
6 KiB
C++
//------------------------------------------------------------------------------
|
|
//
|
|
// File: dllentry.cpp
|
|
// Copyright (C) 1995-1997 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// Purpose:
|
|
// Defines the initialization routines for the DLL.
|
|
//
|
|
// This file needs minor changes, as marked by TODO comments. However, the
|
|
// functions herein are only called by the system, Espresso, or the framework,
|
|
// and you should not need to look at them extensively.
|
|
//
|
|
// Owner:
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "clasfact.h"
|
|
#include "impparse.h"
|
|
|
|
#define __DLLENTRY_CPP
|
|
#include "dllvars.h"
|
|
|
|
LONG g_lActiveClasses = 0;
|
|
|
|
static AFX_EXTENSION_MODULE parseDLL = { NULL, NULL };
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Main entry point for Win32 DLL. Returns 1, asserts, or throws an exception.
|
|
//------------------------------------------------------------------------------
|
|
extern "C" int APIENTRY
|
|
DllMain(
|
|
HINSTANCE hInstance, // Instance handle of this DLL.
|
|
DWORD dwReason, // Attaching or detaching.
|
|
LPVOID lpReserved) // Unused.
|
|
{
|
|
UNREFERENCED_PARAMETER(lpReserved);
|
|
|
|
if (DLL_PROCESS_ATTACH == dwReason)
|
|
{
|
|
LTTRACE("DLLNAME.DLL Initializing!\n"); // TODO: Change name.
|
|
|
|
// Extension DLL one-time initialization.
|
|
|
|
AfxInitExtensionModule(parseDLL, hInstance);
|
|
|
|
// Insert this DLL into the resource chain.
|
|
|
|
new CDynLinkLibrary(parseDLL);
|
|
g_hDll = hInstance;
|
|
g_puid.m_pid = CLocImpParser::m_pid;
|
|
g_puid.m_pidParent = pidNone;
|
|
|
|
}
|
|
else if (DLL_PROCESS_DETACH == dwReason)
|
|
{
|
|
LTTRACE("DLLNAME.DLL Terminating!\n"); // TODO: Change name
|
|
|
|
// If there are active classes, they WILL explode badly once the
|
|
// DLL is unloaded...
|
|
|
|
LTASSERT(DllCanUnloadNow() == S_OK);
|
|
|
|
// Extension DLL shutdown.
|
|
|
|
AfxTermExtensionModule(parseDLL);
|
|
}
|
|
|
|
// Return OK.
|
|
|
|
return 1;
|
|
} // end of ::DllMain()
|
|
|
|
|
|
// TODO: Use GUIDGEN.EXE to replace this class ID with a unique one.
|
|
// GUIDGEN is supplied with MSDEV (VC++ 4.0) as part of the OLE support stuff.
|
|
// Run it and you'll get a little dialog box. Pick radio button 3, "static
|
|
// const struct GUID = {...}". Click on the "New GUID" button, then the "Copy"
|
|
// button, which puts the result in the clipboard. From there, you can just
|
|
// paste it into here. Just remember to change the type to CLSID!
|
|
static const CLSID ciImpParserCLSID =
|
|
{0x033EA178L, 0xC126, 0x11CE, {0x89, 0x49, 0x00, 0xAA, 0x00, 0xA3, 0xF5, 0x51}};
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Entry point to get the unique class ID of the parser interface.
|
|
//------------------------------------------------------------------------------
|
|
STDAPI_(void)
|
|
DllGetParserCLSID(
|
|
CLSID &ciParserCLSID) // Place to return parser interface class ID.
|
|
{
|
|
ciParserCLSID = ciImpParserCLSID;
|
|
|
|
return;
|
|
} // end of ::DllGetParserCLSID()
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Entry point to register this parser. Calls base implementation in ESPUTIL.
|
|
//------------------------------------------------------------------------------
|
|
STDAPI
|
|
DllRegisterParser()
|
|
{
|
|
LTASSERT(g_hDll != NULL);
|
|
|
|
HRESULT hr = ResultFromScode(E_UNEXPECTED);
|
|
|
|
hr = RegisterParser(g_hDll);
|
|
|
|
return ResultFromScode(hr);
|
|
} // end of ::DllRegisterParser()
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Entry point to unregister this parser. Calls the base implementation in
|
|
// ESPUTIL.
|
|
//------------------------------------------------------------------------------
|
|
STDAPI
|
|
DllUnregisterParser()
|
|
{
|
|
LTASSERT(g_hDll != NULL);
|
|
|
|
HRESULT hr = ResultFromScode(E_UNEXPECTED);
|
|
|
|
hr = UnregisterParser(CLocImpParser::m_pid, pidNone);
|
|
|
|
return ResultFromScode(hr);
|
|
} // end of ::DllUnregisterParser()
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Entry point to return the class factory interface.
|
|
//
|
|
// Return values: some sort of result code
|
|
// ppClassFactory points to a CLocImpClassFactory object
|
|
// on success
|
|
//------------------------------------------------------------------------------
|
|
STDAPI
|
|
DllGetClassObject(
|
|
REFCLSID cidRequestedClass, // Class ID for desired parser interfaces.
|
|
REFIID iid, // Desired parser interface.
|
|
LPVOID *ppClassFactory) // Return pointer to object with interface.
|
|
// Note that it's a hidden double pointer!
|
|
{
|
|
LTASSERT(ppClassFactory != NULL);
|
|
|
|
SCODE sc = E_UNEXPECTED;
|
|
|
|
*ppClassFactory = NULL;
|
|
|
|
if (cidRequestedClass != ciImpParserCLSID)
|
|
{
|
|
sc = CLASS_E_CLASSNOTAVAILABLE;
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
CLocImpClassFactory *pClassFactory;
|
|
|
|
pClassFactory = new CLocImpClassFactory;
|
|
|
|
sc = pClassFactory->QueryInterface(iid, ppClassFactory);
|
|
|
|
pClassFactory->Release();
|
|
}
|
|
catch (CMemoryException *pMemExcep)
|
|
{
|
|
sc = E_OUTOFMEMORY;
|
|
pMemExcep->Delete();
|
|
}
|
|
}
|
|
|
|
return ResultFromScode(sc);
|
|
} // end of ::DllGetClassObject()
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Entry point to query if the DLL can unload.
|
|
//------------------------------------------------------------------------------
|
|
STDAPI
|
|
DllCanUnloadNow()
|
|
{
|
|
SCODE sc;
|
|
|
|
sc = (0 == g_lActiveClasses) ? S_OK : S_FALSE;
|
|
|
|
return ResultFromScode(sc);
|
|
} // end of ::DllCanUnloadNow()
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Global function used in the parser to increment the active class count.
|
|
//------------------------------------------------------------------------------
|
|
void
|
|
IncrementClassCount()
|
|
{
|
|
InterlockedIncrement(&g_lActiveClasses);
|
|
|
|
return;
|
|
} // end of ::IncrementClassCount()
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
//
|
|
// Global function used in the parser to decrement the active class count.
|
|
//------------------------------------------------------------------------------
|
|
void
|
|
DecrementClassCount()
|
|
{
|
|
LTASSERT(g_lActiveClasses != 0);
|
|
|
|
InterlockedDecrement(&g_lActiveClasses);
|
|
|
|
return;
|
|
} // end of ::DecrementClassCount()
|