Annotation of q_a/samples/simpldll/loadtest.c, revision 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.