|
|
1.1 ! root 1: /*************************************************************************\ ! 2: * PROGRAM: othrproc.c ! 3: * ! 4: * PURPOSE: ! 5: * ! 6: * To assist in showing how to processes can share named shared memory. ! 7: * ! 8: * GLOBAL VARIABLES: ! 9: * ! 10: * HANDLE hInst: - Instance handle. ! 11: * ! 12: * HWND hWnd: - Client window handle. ! 13: * ! 14: * HWND hWndDlg:- Window handle to upper dialog box. ! 15: * ! 16: * HANDLE hMapObject: ! 17: * - Handle to the file mapping object. ! 18: * ! 19: * LONG *MapView: - Base address of the share memory. ! 20: * ! 21: * CHAR Buf[80], Buf2[80]: ! 22: * - Error buffers. ! 23: * ! 24: * ! 25: * FUNCTIONS: ! 26: * ! 27: * WinMain() - Initializes the window, and process the message loop. ! 28: * MainWndProc() - To handle the messages to the main window. ! 29: * ReadProc() - A thread which loops; reading the shared memory ! 30: * and drawing a bitmap in a location indicated by ! 31: * the values in the share memory. ! 32: * ! 33: * COMMENTS: ! 34: * ! 35: * Overview: ! 36: * This sample is meant to be run with the Sharemem sample. This ! 37: * code basically reads the shared memory, and based on the values ! 38: * found there (an X and Y coordinate representing the mouse ! 39: * position in the window of the Sharemem sample), this code draws ! 40: * a bitmap in the same relative position. ! 41: * ! 42: * To Use: ! 43: * Start the Sharemem sample first, and then this one. Set the ! 44: * focus to this application, and then move the mouse in the window ! 45: * of the Sharemem application. A bitmap will be drawn to represent ! 46: * the relative mouse position in the other application, and the ! 47: * mouse's X and Y coordinates will appear in the edit fields in ! 48: * the dialog box imposed on the top of the client space. ! 49: * ! 50: \*************************************************************************/ ! 51: ! 52: #include <windows.h> ! 53: #include <stdlib.h> ! 54: #include <stdio.h> ! 55: #include "othrproc.h" ! 56: ! 57: #define WERR(who,where) {sprintf(Buf,"ERROR: %s returned %u, line: %u", who, GetLastError(), __LINE__);\ ! 58: sprintf(Buf2,"From within %s", where);\ ! 59: MessageBox(hwnd, Buf, Buf2, MB_OK);} ! 60: ! 61: CHAR Buf[80]; ! 62: CHAR Buf2[80]; ! 63: ! 64: HANDLE hInst; ! 65: HANDLE hMapObject; ! 66: HWND hWnd, hWndDlg; ! 67: HANDLE hThread; ! 68: LONG *MapView; ! 69: ! 70: ! 71: ! 72: /*************************************************************************\ ! 73: * ! 74: * FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int) ! 75: * ! 76: * PURPOSE: To initialize the window, and process the message loop. ! 77: * ! 78: * COMMENTS: A fairly standard WinMain except that it creates a dialog ! 79: * box which is imposed on the upper part of the window. This ! 80: * dialog box is used to show the mouse coordinates. ! 81: * ! 82: \*************************************************************************/ ! 83: ! 84: int APIENTRY WinMain (HANDLE hInstance, ! 85: HANDLE hPrevInstance, ! 86: LPSTR lpCmdLine, ! 87: int nCmdShow) ! 88: ! 89: ! 90: { ! 91: ! 92: MSG msg; ! 93: WNDCLASS wc; ! 94: RECT rect; ! 95: ! 96: UNREFERENCED_PARAMETER( lpCmdLine ); ! 97: UNREFERENCED_PARAMETER( hPrevInstance ); ! 98: ! 99: hInst = hInstance; ! 100: ! 101: wc.style = NULL; // Replaces CS_SIZEREDRAW. ! 102: wc.lpfnWndProc = (WNDPROC)MainWndProc; // The client window procedure. ! 103: wc.cbClsExtra = 0; // No room reserved for extra data. ! 104: wc.cbWndExtra = 0; ! 105: wc.hInstance = hInstance; ! 106: wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); ! 107: wc.hCursor = LoadCursor (NULL, IDC_ARROW); ! 108: wc.hbrBackground = GetStockObject (WHITE_BRUSH); ! 109: wc.lpszMenuName = ""; ! 110: wc.lpszClassName = "OthrProcWClass"; ! 111: ! 112: RegisterClass(&wc); ! 113: ! 114: hWnd = CreateWindow ("OthrProcWClass", ! 115: "Other Procedure", ! 116: WS_OVERLAPPEDWINDOW, ! 117: CW_USEDEFAULT, ! 118: CW_USEDEFAULT, ! 119: CW_USEDEFAULT, ! 120: CW_USEDEFAULT, ! 121: NULL, ! 122: NULL, ! 123: hInstance, ! 124: NULL); ! 125: ! 126: hWndDlg = CreateDialog (hInst, "StatusDlg", hWnd, NULL); ! 127: ! 128: GetClientRect (hWnd, &rect); ! 129: SendMessage (hWnd, WM_SIZE, 0, (rect.right - rect.left)); ! 130: ShowWindow (hWndDlg, SW_SHOW); ! 131: ShowWindow (hWnd, nCmdShow); ! 132: ! 133: while (GetMessage (&msg, NULL, NULL, NULL)) ! 134: if (!IsDialogMessage (hWndDlg, &msg)) ! 135: { ! 136: DispatchMessage (&msg); // Dispatch message to window. ! 137: } ! 138: ! 139: return (msg.wParam); // Returns value from PostQuitMessage. ! 140: ! 141: } ! 142: ! 143: /*************************************************************************\ ! 144: * ! 145: * FUNCTION: MainWndProc (HWND, UINT, UINT, LONG) ! 146: * ! 147: * PURPOSE: To process messages. To open and gain access to the shared ! 148: * memory. ! 149: * ! 150: * VARIABLES USED: ! 151: * ! 152: * - ThreadID: ! 153: * DWORD, used in the CreateThread call. ! 154: * ! 155: * MESSAGES: ! 156: * ! 157: * WM_DESTROY - Cleans up handles and destroys the window. ! 158: * WM_SIZE - Sizes the dialog box to the client window. ! 159: * WM_CREATE - First it opens the shared memory using ! 160: * OpenFileMapping(). It then gets an address to ! 161: * the shared memory by using MapViewOfFile(). ! 162: * If both calls were successful, this code then ! 163: * creates a thread which continually reads the ! 164: * shared memory and draws the bitmap. ! 165: * ! 166: * CALLED BY: ! 167: * ! 168: * WinMain(); ! 169: * ! 170: * CALLS TO: ! 171: * ! 172: * ReadProc(); ! 173: * ! 174: \*************************************************************************/ ! 175: ! 176: LONG APIENTRY MainWndProc (HWND hwnd, ! 177: UINT message, ! 178: UINT wParam, ! 179: LONG lParam) ! 180: { ! 181: DWORD ThreadID; ! 182: ! 183: switch (message) ! 184: { ! 185: ! 186: case WM_CREATE: ! 187: hMapObject = OpenFileMapping (FILE_MAP_READ, ! 188: FALSE, ! 189: "shared_memory"); ! 190: ! 191: if (!hMapObject) ! 192: { ! 193: WERR("OpenFileMapping","WM_CREATE"); ! 194: PostQuitMessage (0); ! 195: return (0); ! 196: } ! 197: ! 198: (LPVOID)MapView = MapViewOfFile (hMapObject, ! 199: FILE_MAP_READ, ! 200: 0, 0, 0); ! 201: if (!MapView) ! 202: { ! 203: MessageBox (hwnd, "ERROR: MapViewOfFile was not successful.", ! 204: "From within WM_CREATE", MB_OK); ! 205: PostQuitMessage (0); ! 206: return (0); ! 207: } ! 208: ! 209: hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadProc, ! 210: NULL, 0, &ThreadID); ! 211: if (!hThread) ! 212: { ! 213: WERR("CreateThread", "WM_CREATE"); ! 214: PostQuitMessage(0); ! 215: } ! 216: ! 217: return (0); ! 218: ! 219: case WM_SIZE : ! 220: SetWindowPos (hWndDlg, NULL, 0,0, LOWORD(lParam), DIALOGHEIGHT, NULL); ! 221: return (0); ! 222: ! 223: case WM_DESTROY : ! 224: CloseHandle (hMapObject); ! 225: CloseHandle (hThread); ! 226: PostQuitMessage (0); ! 227: EndDialog(hWndDlg, 0); ! 228: return (0); ! 229: ! 230: } ! 231: return DefWindowProc (hwnd, message, wParam, lParam); ! 232: } ! 233: ! 234: /*************************************************************************\ ! 235: * ! 236: * FUNCTION: VOID ReadProc (VOID) ! 237: * ! 238: * PURPOSE: A thread which continually reads the shared memory for new ! 239: * X and Y coordinates, and then draws the bitmap where indicated. ! 240: * ! 241: * VARIABLES USED: ! 242: * ! 243: * - hCrossHair: ! 244: * A handle to the bitmap. ! 245: * ! 246: * - lParam, oldParam: ! 247: * LONGs used to hold the new and the old mouse coordinates. ! 248: * ! 249: * - hDC, hDCMem: ! 250: * The DC of the window, and a memory DC used as the source ! 251: * of the bitmap. ! 252: * ! 253: * - X, Y: Integers representing the X and Y coordinates taken from ! 254: * the shared memory and used to locate the bitmap. ! 255: * ! 256: * - hBrush: ! 257: * Handle to a brush, used to erase the old bitmap before ! 258: * redrawing it in the new location. ! 259: * ! 260: * - rect: A RECT, used to blot out the old bitmap (erasing it); ! 261: * ! 262: * - bm: a BITMAP structure for the bitmap. ! 263: * ! 264: * - ptSize, ptOrg: ! 265: * POINTS used in transforming the coordinates for the bitmap. ! 266: * ! 267: * COMMENTS: ! 268: * ! 269: * This function first uses structured exception handling to try to ! 270: * read the shared memory a first time. If successful, it's assumed ! 271: * that the rest of the read will not cause an exception. The code then ! 272: * sets a brush for erasing the bitmap, and loads the bitmap. It then ! 273: * begins to loop. Each loop reads the memory. If the value has ! 274: * changed since the last read the old bitmap is erased by drawing a ! 275: * rectangle over the old coordinates, and then the bitmap is moved ! 276: * and redrawn using the new coordinates. ! 277: * ! 278: \*************************************************************************/ ! 279: VOID ReadProc(VOID) ! 280: { ! 281: HBITMAP hCrossHair; ! 282: LONG lParam, oldParam; ! 283: HDC hDC, hDCMem; ! 284: int X, Y; ! 285: HANDLE hBrush; ! 286: RECT Rect; ! 287: BITMAP bm; ! 288: POINT ptSize, ptOrg; ! 289: ! 290: try ! 291: { ! 292: lParam = MapView[0]; ! 293: } ! 294: except(EXCEPTION_EXECUTE_HANDLER) ! 295: { ! 296: MessageBox( hWnd, "Trying to read shared memory caused an exception.", ! 297: "From within WM_MOUSEMOVE", MB_OK); ! 298: PostMessage(hWnd, WM_DESTROY, NULL, NULL); ! 299: } ! 300: ! 301: hBrush = GetStockObject(WHITE_BRUSH); ! 302: X = LOWORD(lParam); ! 303: Y = HIWORD(lParam); ! 304: ! 305: hCrossHair = LoadBitmap(hInst, "CrossHair"); ! 306: ! 307: while (1) ! 308: { ! 309: lParam = MapView[0]; ! 310: ! 311: if (lParam != oldParam) ! 312: { ! 313: ! 314: hDC = GetDC(hWnd); ! 315: ! 316: Rect.top = Y; Rect.left = X; Rect.bottom = Y+16; Rect.right = X+16; ! 317: FillRect(hDC, &Rect, hBrush); ! 318: ! 319: ! 320: X = LOWORD(lParam); ! 321: Y = HIWORD(lParam); ! 322: ! 323: hDCMem = CreateCompatibleDC(hDC); ! 324: SelectObject(hDCMem, hCrossHair); ! 325: SetMapMode(hDCMem, GetMapMode(hDC)); ! 326: ! 327: GetObject(hCrossHair, sizeof(BITMAP), &bm); ! 328: ! 329: ptSize.x = bm.bmWidth; ! 330: ptSize.y = bm.bmHeight; ! 331: DPtoLP (hDC, &ptSize, 1); ! 332: ! 333: ptOrg.x = 0; ! 334: ptOrg.y = 0; ! 335: DPtoLP (hDCMem, &ptOrg, 1); ! 336: ! 337: BitBlt(hDC, X, Y, ptSize.x, ptSize.y, ! 338: hDCMem, ptOrg.x, ptOrg.y, SRCCOPY); ! 339: ! 340: oldParam = lParam; ! 341: SetDlgItemInt (hWndDlg, IDE_XCOORD, X, FALSE); ! 342: SetDlgItemInt (hWndDlg, IDE_YCOORD, Y, FALSE); ! 343: ReleaseDC(hWnd, hDC); ! 344: DeleteDC(hDCMem); ! 345: ! 346: Sleep(100); ! 347: } ! 348: ! 349: } ! 350: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.