|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <stdlib.h> ! 3: #include <stdarg.h> ! 4: #include <windows.h> ! 5: #include <string.h> ! 6: #include <winbase.h> ! 7: #include "tlsdll.h" ! 8: ! 9: #define NUMTHREADS 3 /* The number of threads to start */ ! 10: ! 11: /*-----------------------------------------------------------------*/ ! 12: ! 13: void ErrorOut(char errstring[30]) ! 14: /* ! 15: Purpose: Print out an meainful error code by means of ! 16: GetLastError and printf ! 17: ! 18: Inputs: errstring - the action that failed, passed by the ! 19: calling proc. ! 20: ! 21: Returns: none ! 22: ! 23: Calls: GetLastError ! 24: */ ! 25: ! 26: { ! 27: DWORD Error; ! 28: ! 29: Error= GetLastError(); ! 30: printf("Error on %s = %d\n", errstring, Error); ! 31: } ! 32: ! 33: /*-----------------------------------------------------------------*/ ! 34: ! 35: void Another_Thread() ! 36: /* ! 37: Purpose: Make a call into a DLL and then terminate, allowing ! 38: DLL init. and termination to be called. ! 39: ! 40: Inputs: none ! 41: ! 42: Returns: none ! 43: ! 44: Calls: TlsInit: Dummy proc. to allow DLL initialization. ! 45: */ ! 46: ! 47: { ! 48: Sleep(300); /* Sleep while other threads start */ ! 49: TlsInit(); /* Call dummy init. procedure */ ! 50: ExitThread(0); /* Exit, calling DLL termination */ ! 51: } ! 52: ! 53: /*-----------------------------------------------------------------*/ ! 54: ! 55: void main(void) ! 56: /* ! 57: Purpose: Make a call into a DLL and then terminate, allowing ! 58: DLL init. and termination to be called. ! 59: ! 60: Inputs: none ! 61: ! 62: Returns: none ! 63: ! 64: Calls: CreateThread: to create threads for DLL init. ! 65: ErrorOut: To output any errors ! 66: WaitForMultipleObjects: To wait on thread(s) termination ! 67: */ ! 68: ! 69: { ! 70: DWORD threadid; ! 71: HANDLE hThreads[3]; ! 72: int count; ! 73: ! 74: /* start NUMTHREADS threads */ ! 75: for (count = 0 ; count < NUMTHREADS ; count++) ! 76: { ! 77: hThreads[count]= CreateThread(NULL, ! 78: 0, ! 79: (LPTHREAD_START_ROUTINE)Another_Thread, ! 80: NULL, ! 81: 0, ! 82: &threadid); ! 83: if( hThreads[count] == 0) ! 84: ErrorOut("CreateThread"); ! 85: else ! 86: printf("\nStarting thread# %d\n\n", count +1); ! 87: } ! 88: ! 89: /* now wait for threads to terminate */ ! 90: printf("\n\n***** Waiting for %d Threads to Exit*****\n\n", NUMTHREADS); ! 91: WaitForMultipleObjects( NUMTHREADS, ! 92: hThreads, ! 93: FALSE, ! 94: 0xFFFFFFFF); ! 95: Sleep(1000); ! 96: printf("\n\n***** All %d Threads Terminated *****\n\n", NUMTHREADS); ! 97: ! 98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.