Example of a User-Created _DLL_InitTerm Function

 


_DLL_InitTerm Function
#include <windows.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#define  CCHMAXPATH  255

/* _CRT_init is the C run-time environment initialization function.         */

/* It will return 0 to indicate success and -1 to indicate failure.         */



int _CRT_init(void);

#ifdef   STATIC_LINK



/* _CRT_term is the C run-time environment termination function.            */

/* It only needs to be called when the C run-time functions are statically  */

/* linked.                                                                  */

void _CRT_term(void);

#else



static void  cleanup(void);

#endif

size_t nSize;

int *pArray;



/* _DLL_InitTerm is the function that gets called by the operating system   */
/* loader when it loads and frees this DLL for each process that accesses   */
/* this DLL.  However, it only gets called the first time the DLL is loaded */
/* and the last time it is freed for a particular process.  The system      */
/* linkage convention MUST be used because the operating system loader is   */
/* calling this function.                                                   */


unsigned long _System _DLL_InitTerm(unsigned long hModule, unsigned long

                                    ulFlag, long * dummy)

{

   size_t i;

   int  rc;

   char namebuf[CCHMAXPATH];



   /* If ulFlag is one then the DLL is being loaded so initialization should*/
   /* be performed.  If ulFlag is zero then the DLL is being freed so       */
   /* termination should be performed.                                      */


   switch (ulFlag) {

      case 1 :


         /*******************************************************************/
         /* The C run-time environment initialization function must be      */
         /* called before any calls to C run-time functions that are not    */
         /* inlined.                                                        */
         /*******************************************************************/


         if (_CRT_init() == -1)

            return 0UL;

#ifndef  STATIC_LINK



         /*******************************************************************/
         /* Cleanup routine is registered by atexit function to clean up    */
         /* if the runtime is dynamically linked.                           */
         /*******************************************************************/


            if (atexit(cleanup))

               printf("atexit for cleanup failed\n");

#endif

         if ((rc = GetModuleFileName((void *)hModule, namebuf, CCHMAXPATH)) == 0)

            printf("GetModuleFileName returned %lu\n", GetLastError());

         else

            printf("The name of this DLL is %s\n", namebuf);

         srand(17);

         nSize = (rand()%128)+32;

         printf("The array size for this process is %u\n", nSize);

         if ((pArray = malloc(nSize *sizeof(int))) == NULL) {

            printf("Could not allocate space for unsorted array.\n");

            return 0UL;

         }

         for (i = 0; i < nSize; ++i)

            pArray[i] = rand();

         break;

      case 0 :

#ifdef   STATIC_LINK

         printf("The array will now be freed.\n");

         free(pArray);

         _CRT_term();

#endif

         break;

      default  :

         printf("ulFlag = %lu\n", ulFlag);

         return 0UL;

   }


  /* A non-zero value must be returned to indicate success. */


   return 1UL;

}

#ifndef  STATIC_LINK

static void cleanup(void)

{

   printf("The array will now be freed.\n");

   free(pArray);

   return ;

}

#endif



 



Initializing and Terminating the DLL Environment