### 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