/* _DLL_InitTerm() - called by the loader for DLL initialization/termination */
/* This function must return a non-zero value if successful and a zero value */
/* if unsuccessful. */
unsigned long __stdcall _DLL_InitTerm( HINSTANCE hModule,
DWORD ulFlag, LPVOID dummy)
{
ULONG rc;
/* If ulFlag is DLL_PROCESS_ATTACH then initialization is required: */
/* If the shared memory pointer is NULL then the DLL is being loaded */
/* for the first time so acquire the named shared storage for the */
/* process control structures. A linked list of process control */
/* structures will be maintained. Each time a new process loads this */
/* DLL, a new process control structure is created and it is inserted */
/* at the end of the list by calling DLLREGISTER. */
/* */
/* If ulFlag is DLL_PROCESS_DETTACH then termination is required: */
/* Call DLLDEREGISTER which will remove the process control structure */
/* and free the shared memory block from its virtual address space. */
switch( ulFlag )
{
case DLL_PROCESS_ATTACH:
_rmem_init();
if ( !ulProcessCount )
{
/* Create the shared mutex semaphore. */
if (( hmtxSharedSem = CreateMutex(NULL,
FALSE,
SHARED_SEMAPHORE_NAME)) == NULL)
{
printf( "CreateMutex rc = %lu\n", GetLastError() );
return FALSE;
}
}
/* Register the current process. */
if ( DLLREGISTER( ) )
return FALSE;
break;
case DLL_PROCESS_DETACH:
/* De-register the current process. */
if ( DLLDEREGISTER( ) )
return 0;
_rmem_term();
break;
default:
return 0;
}
/* Indicate success. Non-zero means success!!! */
return TRUE;
}
![]()
WriteYour Own _DLL_InitTerm Function