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;
}