Annotation of q_a/samples/simpldll/loadtest.c, revision 1.1.1.1

1.1       root        1: /************************************************************************\
                      2: *
                      3: *  PROGRAM:     LOADTEST.C
                      4: *
                      5: *  PURPOSE:     A simple demonstration of LoadLibrary()-ing a DLL at
                      6: *               runtime and obtaining function addresses within the DLL.
                      7: *
                      8: *  FUNTIONS:    WinMain()     - initialization, create window, msg loop
                      9: *               MainWndProc() - processes main window msgs
                     10: *               ThreadProc()  - makes a single call into "THE_DLL.DLL"
                     11: *
                     12: \************************************************************************/
                     13: 
                     14: #include <windows.h>
                     15: #include "loadtest.h"
                     16: #include "the_dll.h"
                     17: 
                     18: 
                     19: 
                     20: /************************************************************************\
                     21: *
                     22: *  FUNCTION:    WinMain (standard WinMain INPUTS/RETURNS)
                     23: *
                     24: *  GLOBAL VARS: hwndMain - handle of main app window
                     25: *
                     26: *  LOCAL VARS:  msg - msg to get/dispatch
                     27: *
                     28: \************************************************************************/
                     29: 
                     30: int APIENTRY WinMain (HANDLE hInstance,HANDLE hPrevInstance,
                     31:                       LPSTR lpCmdLine, int nCmdShow)
                     32: { MSG msg;
                     33: 
                     34:   if (!hPrevInstance)
                     35:   {
                     36:     WNDCLASS wc;
                     37: 
                     38:     wc.style         = NULL;
                     39:     wc.lpfnWndProc   = (WNDPROC)MainWndProc;
                     40:     wc.cbClsExtra    = 0;
                     41:     wc.cbWndExtra    = 0;
                     42:     wc.hInstance     = hInstance;
                     43:     wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
                     44:     wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
                     45:     wc.hbrBackground = GetStockObject (WHITE_BRUSH);
                     46:     wc.lpszMenuName  = (LPSTR) "Menu";
                     47:     wc.lpszClassName = (LPSTR) "LOADTEST";
                     48: 
                     49:     if (!RegisterClass (&wc))
                     50:     { MessageBox (NULL, "WinMain(): RegisterClass() failed",
                     51:                   "Err! - LOADTEST", MB_OK | MB_ICONHAND);
                     52:       return(FALSE);
                     53:     }
                     54:   }
                     55: 
                     56:   if (!(hwndMain = CreateWindow ("LOADTEST", "LOADTEST Sample Application",
                     57:                                  WS_OVERLAPPEDWINDOW,
                     58:                                  CW_USEDEFAULT, CW_USEDEFAULT,
                     59:                                  CW_USEDEFAULT, CW_USEDEFAULT,
                     60:                                  NULL, NULL, hInstance, NULL)))
                     61:     return (NULL);
                     62: 
                     63:   ShowWindow(hwndMain, nCmdShow);
                     64: 
                     65:   while (GetMessage(&msg, NULL, NULL, NULL))
                     66:   { TranslateMessage(&msg);
                     67:     DispatchMessage(&msg);
                     68:   }
                     69:   return (msg.wParam);
                     70:   UNREFERENCED_PARAMETER(lpCmdLine);
                     71: }
                     72: 
                     73: 
                     74: 
                     75: /************************************************************************\
                     76: *
                     77: *  FUNCTION:    MainWndProc (standard window procedure INPUTS/RETURNS)
                     78: *
                     79: *  GLOBAL VARS: pfnDLLFunction1 - pointer to DLLFunction1
                     80: *               pfnDLLFunction2 - pointer to DLLFunction2
                     81: *               pfnDLLFunction3 - pointer to DLLFunction3
                     82: *               pfnDLLFunction4 - pointer to DLLFunction4
                     83: *               pfnDLLDialogBox - pointer to DLLDialogBox
                     84: *
                     85: *  LOCAL VARS:  hLib     - handle of THE_DLL.DLL
                     86: *               hSubMenu - handle of our "Options" submenu
                     87: *
                     88: *  COMMENTS:    Menuitems IDM_DLLFUNCTION1 through IDM_DLLDIALOGBOX are
                     89: *               all processed by calling their respective functions in
                     90: *               "THE_DLL.DLL". The "CreateThread" menuitem causes a thread
                     91: *               to be created- the thread then calls into "THE_DLL.DLL".
                     92: *
                     93: \************************************************************************/
                     94: 
                     95: LONG APIENTRY MainWndProc (HWND hwnd, UINT message, UINT wParam,
                     96:                            LONG lParam)
                     97: { static HANDLE hLib = NULL;
                     98:   static HMENU  hSubMenu;
                     99: 
                    100:   switch (message)
                    101:   { case WM_CREATE:
                    102:     { HMENU hMenu = GetMenu (hwnd);
                    103: 
                    104:       hSubMenu = GetSubMenu (hMenu, 0);
                    105:       FixMenu (IDM_FREELIBRARY, hSubMenu);
                    106:       break;
                    107:     }
                    108:     case WM_COMMAND:
                    109:       switch (LOWORD(wParam))
                    110:       { case IDM_LOADLIBRARY:
                    111:           if (!hLib)
                    112:           { if (!(hLib = LoadLibrary ("THE_DLL.DLL")))
                    113:               MessageBox (hwnd,
                    114:                           "MainWndProc(): LoadLibrary () failed",
                    115:                           "Err! - LOADTEST", MB_OK | MB_ICONHAND);
                    116:             else
                    117:             { pfnDLLFunction1 = (PFNDLL) GetProcAddress (hLib,
                    118:                                                          "DLLFunction1");
                    119:               pfnDLLFunction2 = (PFNDLL) GetProcAddress (hLib,
                    120:                                                          "DLLFunction2");
                    121:               pfnDLLFunction3 = (PFNDLL) GetProcAddress (hLib,
                    122:                                                          "DLLFunction3");
                    123:               pfnDLLFunction4 = (PFNDLL) GetProcAddress (hLib,
                    124:                                                          "DLLFunction4");
                    125:               pfnDLLDialogBox = (PFNDLL) GetProcAddress (hLib,
                    126:                                                          "DLLDialogBox");
                    127:               FixMenu (IDM_LOADLIBRARY, hSubMenu);
                    128:             }
                    129:           }
                    130:           break;
                    131:         case IDM_FREELIBRARY:
                    132:           if (hLib)
                    133:           { FreeLibrary (hLib);
                    134:             pfnDLLFunction1 = NULL;
                    135:             pfnDLLFunction2 = NULL;
                    136:             pfnDLLFunction3 = NULL;
                    137:             pfnDLLFunction4 = NULL;
                    138:             pfnDLLDialogBox = NULL;
                    139:             FixMenu (IDM_FREELIBRARY, hSubMenu);
                    140:             hLib = NULL;
                    141:           }
                    142:           break;
                    143:         case IDM_CREATETHREAD:
                    144:         { DWORD tid; /* thread identifier */
                    145: 
                    146:           if (pfnDLLFunction1)
                    147:             CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)
                    148:                           ThreadProc, NULL, NULL, &tid);
                    149: 
                    150:           break;
                    151:         }
                    152:         case IDM_DLLFUNCTION1:
                    153:           if (pfnDLLFunction1)
                    154:             (pfnDLLFunction1) ();
                    155:           break;
                    156:         case IDM_DLLFUNCTION2:
                    157:           if (pfnDLLFunction2)
                    158:             (pfnDLLFunction2) ((int) 0);
                    159:           break;
                    160:         case IDM_DLLFUNCTION3:
                    161:           if (pfnDLLFunction3)
                    162:             (pfnDLLFunction3) ((HANDLE) NULL);
                    163:           break;
                    164:         case IDM_DLLFUNCTION4:
                    165:           if (pfnDLLFunction4)
                    166:             (pfnDLLFunction4) ((HWND) NULL);
                    167:           break;
                    168:         case IDM_DLLDIALOGBOX:
                    169:           if (pfnDLLDialogBox)
                    170:             (pfnDLLDialogBox) (hwnd);
                    171:           break;
                    172:         default:
                    173:           break;
                    174:       }
                    175:       break;
                    176:     case WM_DESTROY:
                    177:       PostQuitMessage(NULL);
                    178:       break;
                    179:     default:
                    180:       return (DefWindowProc(hwnd, message, wParam, lParam));
                    181:   }
                    182:   return (NULL);
                    183: }
                    184: 
                    185: 
                    186: 
                    187: /************************************************************************\
                    188: *
                    189: *  FUNCTION:    Thread
                    190: *
                    191: *  GLOBAL VARS: hwndMain        - handle of main app window
                    192: *               pfnDLLFunction1 - pointer to DLLFunction1
                    193: *
                    194: *  COMMENTS:    Makes a call into "THE_DLL.DLL", and then waits for the
                    195: *               main window to call TerminateThread().
                    196: *
                    197: \************************************************************************/
                    198: 
                    199: void ThreadProc ()
                    200: {
                    201:   MessageBox (hwndMain, "calling DLLFunction1", "ThreadProc()", MB_OK);
                    202:   (pfnDLLFunction1) ();
                    203: }
                    204: 
                    205: 
                    206: 
                    207: /************************************************************************\
                    208: *
                    209: *  FUNCTION:    FixMenu
                    210: *
                    211: *  INPUTS:      choice   - IDM_LOADLIBRARY or IBM_FREELIBRARY
                    212: *               hSubMenu - handle of submenu, the items of which we'll
                    213: *                          enable/disable
                    214: *
                    215: *  LOCAL VARS:  i - loop variable
                    216: *
                    217: *  COMMENTS:    Enables/disables menuitems depending on whether THE_DLL
                    218: *               is loaded/unloaded.
                    219: *
                    220: \************************************************************************/
                    221: 
                    222: void FixMenu (UINT choice, HMENU hSubMenu)
                    223: { UINT i;
                    224: 
                    225:   if (choice == IDM_LOADLIBRARY)
                    226:   {
                    227:     EnableMenuItem (hSubMenu, IDM_LOADLIBRARY, MF_DISABLED | MF_GRAYED |
                    228:                                                MF_BYCOMMAND);
                    229:     for (i = IDM_FREELIBRARY; i <= IDM_DLLDIALOGBOX; i++)
                    230:       EnableMenuItem (hSubMenu, i, MF_ENABLED | MF_BYCOMMAND);
                    231:   }
                    232:   else /* choice == IDM_FREELIBRARY */
                    233:   {
                    234:     EnableMenuItem (hSubMenu, IDM_LOADLIBRARY, MF_ENABLED | MF_BYCOMMAND);
                    235:     for (i = IDM_FREELIBRARY; i <= IDM_DLLDIALOGBOX; i++)
                    236:       EnableMenuItem (hSubMenu, i, MF_DISABLED | MF_GRAYED |MF_BYCOMMAND);
                    237: 
                    238:   }
                    239: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.