### Example (_CRT_term -- Terminate DLL Runtime Environment)

This example shows the _DLL_InitTerm function from the IBM C and C++ Compilers sample program for building DLLs, which calls _CRT_init to initialize the library environment.

    #ifndef WIN32_LEAN_AND_MEAN
       #define WIN32_LEAN_AND_MEAN 1
    #endif
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    /* _CRT_init is the C run-time environment initialization function.         */
    /* It will return 0 to indicate success and -1 to indicate failure.         */

    extern int _IMPORT _CRT_init(void);

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

    extern void _IMPORT _CRT_term(void);

    size_t _Export nSize;
    int *_Export 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 __stdcall _DLL_InitTerm(unsigned long hModule, unsigned long
                                        ulFlag, long * dummy)
    {
       size_t i;
       int  rc;
       char namebuf[MAX_PATH];

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

       switch (ulFlag) {
          case DLL_PROCESS_ATTACH :

             /*******************************************************************/
             /* 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;
             if ((rc = GetModuleFileName((void *)hModule, namebuf, sizeof namebuf)) == 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 DLL_PROCESS_DETACH :
             printf("The array will now be freed.\n");
             free(pArray);
             _CRT_term();
             break;

          default  :
             printf("ulFlag = %lu\n", ulFlag);
             return 0UL;
       }

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

       return 1UL;
    }