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