151 lines
3.6 KiB
C++
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;
|
|
}
|