Annotation of q_a/samples/sharemem/sharemem.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************\
                      2: *  PROGRAM: sharemem.c
                      3: *
                      4: *  PURPOSE:
                      5: *
                      6: *    To demonstrate the use of named shared memory between two independent
                      7: *    processes.
                      8: *
                      9: *  GLOBAL VARIABLES:
                     10: *
                     11: *    HANDLE hInst:  - Instance handle.
                     12: *
                     13: *    HWND hWnd:     - Client window handle.
                     14: *
                     15: *    HWND hWndDlg:  - Handle to the dialog box which is imposed over the
                     16: *                     parent window.
                     17: *
                     18: *    LONG *MapView: - Address of where the file will be mapped to.
                     19: *
                     20: *    HANDLE hMapObject:
                     21: *                   - Handle to the file mapping object.
                     22: *
                     23: *
                     24: *  FUNCTIONS:
                     25: *
                     26: *    WinMain()      - Initializes the window, and process the message loop.
                     27: *    MainWndProc()  - To handle the messages to the main window.
                     28: *
                     29: *  COMMENTS:
                     30: *
                     31: *    Overview:
                     32: *      This sample is accompanied by the Othrproc (Other Procedure)
                     33: *      application.  Basically this code traps WM_MOUSEMOVE messages
                     34: *      and writes them to the shared memory.  The Otherproc code
                     35: *      reads the share memory and blts a small bitmap in the same
                     36: *      relative coordinates.  The effect is to have the mouse move
                     37: *      in one window, while the bitmap moves in the same relative
                     38: *      position in the other window.  The mouse coordinates will appear
                     39: *      in the edit fields of the dialog box at the top of the parent
                     40: *      windows.
                     41: *
                     42: *    To Use:
                     43: *      First start Sharemem, then start Otherproc.  The visual effect
                     44: *      is better if the focus remains with Otherproc, while the mouse
                     45: *      moves with the Sharemem window.
                     46: *
                     47: \*************************************************************************/
                     48: 
                     49: #include <windows.h>
                     50: #include <stdlib.h>
                     51: #include <stdio.h>
                     52: #include "sharemem.h"
                     53: 
                     54: #define WERR(who,where)    {sprintf(Buf,"ERROR: %s returned %u, line: %u", who, GetLastError(), __LINE__);\
                     55:                             sprintf(Buf2,"From within %s", where);\
                     56:                             MessageBox(hwnd, Buf, Buf2, MB_OK);}
                     57: 
                     58: CHAR Buf[80];
                     59: CHAR Buf2[80];
                     60: 
                     61: 
                     62: HANDLE hInst;
                     63: HANDLE hMapObject;
                     64: HWND   hWnd, hWndDlg;
                     65: LONG   *MapView;
                     66: 
                     67: 
                     68: 
                     69: /*************************************************************************\
                     70: *
                     71: *  FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
                     72: *
                     73: *  PURPOSE:  Initializes the window, processes message loop.
                     74: *
                     75: *  COMMENTS: A fairly standard WinMain except that it creates a dialog
                     76: *            box which is imposed on the upper part of the window.  This
                     77: *            dialog box is used to show the mouse coordinates.
                     78: *
                     79: \*************************************************************************/
                     80: 
                     81: int APIENTRY WinMain (HANDLE hInstance,
                     82:                       HANDLE hPrevInstance,
                     83:                       LPSTR  lpCmdLine,
                     84:                       int    nCmdShow)
                     85: 
                     86: 
                     87: {
                     88: 
                     89:   MSG  msg;
                     90:   WNDCLASS wc;
                     91:   RECT rect;
                     92: 
                     93:   UNREFERENCED_PARAMETER( lpCmdLine );
                     94:   UNREFERENCED_PARAMETER( hPrevInstance );
                     95: 
                     96:   hInst = hInstance;
                     97: 
                     98:   wc.style = NULL;
                     99:   wc.lpfnWndProc = (WNDPROC)MainWndProc;
                    100:   wc.cbClsExtra = 0;
                    101:   wc.cbWndExtra = 0;
                    102:   wc.hInstance = hInstance;
                    103:   wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
                    104:   wc.hCursor = LoadCursor (NULL, IDC_ARROW);
                    105:   wc.hbrBackground = GetStockObject (WHITE_BRUSH);
                    106:   wc.lpszMenuName = "";
                    107:   wc.lpszClassName = "ShareMemWClass";
                    108: 
                    109:   RegisterClass(&wc);
                    110: 
                    111:   hWnd = CreateWindow ("ShareMemWClass",
                    112:                        "Shared Memory Sample",
                    113:                        WS_OVERLAPPEDWINDOW,
                    114:                        CW_USEDEFAULT,
                    115:                        CW_USEDEFAULT,
                    116:                        CW_USEDEFAULT,
                    117:                        CW_USEDEFAULT,
                    118:                        NULL,
                    119:                        NULL,
                    120:                        hInstance,
                    121:                        NULL);
                    122: 
                    123:   hWndDlg     = CreateDialog (hInst, "StatusDlg", hWnd, NULL);
                    124: 
                    125:   GetClientRect (hWnd, &rect);
                    126:   SendMessage (hWnd, WM_SIZE, 0, (rect.right - rect.left));
                    127:   ShowWindow  (hWndDlg,  SW_SHOW);
                    128:   ShowWindow  (hWnd, nCmdShow);
                    129: 
                    130:   while (GetMessage (&msg, NULL, NULL, NULL))
                    131:     if (!IsDialogMessage (hWndDlg, &msg))
                    132:       {
                    133:        DispatchMessage (&msg);   // Dispatch message to window.
                    134:       }
                    135: 
                    136:   return (msg.wParam);           // Returns value from PostQuitMessage.
                    137: 
                    138: }
                    139: 
                    140: /*************************************************************************\
                    141: *
                    142: *  FUNCTION:  MainWndProc (HWND, UINT, UINT, LONG)
                    143: *
                    144: *  PURPOSE:   To process messages.  To create the shared memory.
                    145: *
                    146: *  MESSAGES:
                    147: *
                    148: *    WM_CREATE       - Create the shared memory by calling
                    149: *                      CreateFileMapping().  This memory is the size
                    150: *                      of a DWORD, all the size that is needed to pass
                    151: *                      mouse coordinates.  If the CreateFileMapping()
                    152: *                      call is successful, it then calls MapViewOfFile()
                    153: *                      to get the address of the memory.
                    154: *
                    155: *    WM_MOUSEMOVE    - Traps the mouse move messages, and uses structured
                    156: *                      exception handling to write the mouse coordinates
                    157: *                      to the share memory.  It also sends the coordinates
                    158: *                      to the edit fields of the dialog box.
                    159: *
                    160: *    WM_DESTROY      - Closes the memory handle, and destroys the window.
                    161: *
                    162: *    WM_SIZE         - Updates the size of the dialog box to maintain
                    163: *                      its relative size to the client window.
                    164: *
                    165: *  CALLED BY:
                    166: *
                    167: *    WinMain();
                    168: *
                    169: \*************************************************************************/
                    170: 
                    171: LONG APIENTRY MainWndProc (HWND hwnd,
                    172:                            UINT message,
                    173:                            UINT wParam,
                    174:                            LONG lParam)
                    175: {
                    176: 
                    177:   switch (message)
                    178:       {
                    179: 
                    180:         case WM_CREATE:
                    181:           hMapObject = CreateFileMapping ((HANDLE) 0xFFFFFFFF,
                    182:                                           NULL,
                    183:                                           PAGE_READWRITE,
                    184:                                           0,
                    185:                                           sizeof(DWORD),
                    186:                                           "shared_memory");
                    187:           if (!hMapObject)
                    188:             {
                    189:              WERR("CreateFileMapping","WM_CREATE");
                    190:             }
                    191:           (LPVOID)MapView = MapViewOfFile (hMapObject,
                    192:                                            FILE_MAP_WRITE,
                    193:                                            0, 0, 0);
                    194:           if (!MapView)
                    195:             MessageBox (hwnd, "ERROR: MapViewOfFile was not successful.",
                    196:                         "From within WM_CREATE", MB_OK);
                    197:           return (0);
                    198: 
                    199: 
                    200:         case WM_SIZE :
                    201:           SetWindowPos (hWndDlg, NULL, 0,0, LOWORD(lParam), DIALOGHEIGHT, NULL);
                    202:           return (0);
                    203: 
                    204: 
                    205:         case WM_MOUSEMOVE:
                    206: 
                    207:           try
                    208:             {
                    209:              MapView[0] = lParam;
                    210:             }
                    211:             except(EXCEPTION_EXECUTE_HANDLER)
                    212:             {
                    213:               MessageBox( hwnd, "Trapped an exception when writing to memory.",
                    214:                           "From within WM_MOUSEMOVE", MB_OK);
                    215:             }
                    216: 
                    217:           SetDlgItemInt (hWndDlg, IDE_XCOORD, LOWORD(lParam), FALSE);
                    218:           SetDlgItemInt (hWndDlg, IDE_YCOORD, HIWORD(lParam), FALSE);
                    219:           return (0);
                    220: 
                    221:         case WM_DESTROY :
                    222:             CloseHandle (hMapObject);
                    223:             PostQuitMessage (0);
                    224:             return (0);
                    225: 
                    226:        }
                    227:     return DefWindowProc (hwnd, message, wParam, lParam);
                    228: }

unix.superglobalmegacorp.com

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