windows-nt/Source/XPSP1/NT/printscan/print/spooler/wpnpinst/dll32/dllini.cxx
2020-09-26 16:20:57 +08:00

151 lines
3.6 KiB
C++

/*****************************************************************************\
* MODULE: dllini.cxx
*
* Dll entry/exit routines.
*
*
* Copyright (C) 1997-1998 Hewlett-Packard Company.
* Copyright (C) 1997-1998 Microsoft Corporation.
*
* History:
* 10-Oct-1997 GFS Created
* 22-Jun-1998 CHW Cleaned
*
\*****************************************************************************/
#include "libpriv.h"
/*********************************************************** local routine ***\
* dll_ThunkError
*
*
\*****************************************************************************/
BOOL dll_ThunkError(VOID)
{
LPTSTR pszMsg;
int nFmt;
pszMsg = NULL;
nFmt = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&pszMsg,
0,
NULL);
if (pszMsg && (nFmt > 0)) {
// Display the string.
//
MessageBox(NULL, pszMsg, g_szMsgThunkFail, MB_OK | MB_ICONINFORMATION);
// Free the buffer.
//
GlobalFree(pszMsg);
}
return FALSE;
}
/*********************************************************** local routine ***\
* dll_ProcessAttach
*
* Called when the process attaches to the dynalink. This is the place
* that is good to allocate global resouces.
*
\*****************************************************************************/
_inline BOOL dll_ProcessAttach(
BOOL bThk,
HINSTANCE hModule)
{
BOOL bRet;
// Set the global hInstance.
//
g_hLibInst = hModule;
bRet = InitStrings();
if (bRet && (bThk == FALSE))
bRet = dll_ThunkError();
return bRet;
}
/*********************************************************** local routine ***\
* dll_ProcessDetach
*
* Called when a process detaches from the DLL. This is only called once,
* so all resources allocated on behalf of the dynalink are freed.
*
\*****************************************************************************/
_inline BOOL dll_ProcessDetach(
BOOL bThk,
HINSTANCE hModule)
{
if (bThk == FALSE)
dll_ThunkError();
FreeStrings();
return TRUE;
}
/****************************************************** entry/exit routine ***\
* DllMain
*
* This routine is called upon startup of the dynalink. If all goes well
* then return TRUE. By returning FALSE you prevent the dynalink from
* loading.
*
* The parameters to this function double under DOS and NT. The meanings are
* slightly different however.
*
* Parameter DOS NT
* -------- ----------------- -------------
* hHandle Instance handle Module handle (same as instance)
* nAttach Dynalink Data*Seg Attach type.
* pContext Command Line args pointer to context structur.
*
*
\*****************************************************************************/
BOOL APIENTRY DllMain(
HINSTANCE hModule,
int nAttach,
PCONTEXT pContext)
{
BOOL bRet;
BOOL bThk;
UNREFPARM(pContext);
// Connect the thunk.
//
bThk = thk_ThunkConnect32(g_szDll16, g_szDll32, hModule, nAttach);
switch (nAttach) {
case DLL_PROCESS_ATTACH:
bRet = dll_ProcessAttach(bThk, hModule);
break;
case DLL_PROCESS_DETACH:
bRet = dll_ProcessDetach(bThk, hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
bRet = TRUE;
break;
}
return bRet;
}