home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / audio / midimon / instdata.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  2KB  |  85 lines

  1. /**************************************************************************
  2.  *
  3.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6.  *  PURPOSE.
  7.  *
  8.  *  Copyright (C) 1993 - 1997  Microsoft Corporation.  All Rights Reserved.
  9.  * 
  10.  **************************************************************************/
  11.  
  12. /*
  13.  * instdata.c - Functions to allocate and free the instance
  14.  *      data structure passed to the low-level callback function.
  15.  */
  16.  
  17. #include <windows.h>
  18. #include <mmsystem.h>
  19. #include "midimon.h"
  20. #include "circbuf.h"
  21. #include "instdata.h"
  22.  
  23. /* AllocCallbackInstanceData - Allocates a CALLBACKINSTANCEDATA
  24.  *      structure.  This structure is used to pass information to the
  25.  *      low-level callback function, each time it receives a message.
  26.  *
  27.  *      Because this structure is accessed by the low-level callback
  28.  *      function, it must be allocated using GlobalAlloc() with the 
  29.  *      GMEM_SHARE and GMEM_MOVEABLE flags and page-locked with
  30.  *      GlobalPageLock().
  31.  *
  32.  * Params:  void
  33.  *
  34.  * Return:  A pointer to the allocated CALLBACKINSTANCE data structure.
  35.  */
  36. LPCALLBACKINSTANCEDATA FAR PASCAL AllocCallbackInstanceData(void)
  37. {
  38.     HANDLE hMem;
  39.     LPCALLBACKINSTANCEDATA lpBuf;
  40.     
  41.     /* Allocate and lock global memory.
  42.      */
  43.     hMem = GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE,
  44.                        (DWORD)sizeof(CALLBACKINSTANCEDATA));
  45.     if(hMem == NULL)
  46.         return NULL;
  47.     
  48.     lpBuf = (LPCALLBACKINSTANCEDATA)GlobalLock(hMem);
  49.     if(lpBuf == NULL){
  50.         GlobalFree(hMem);
  51.         return NULL;
  52.     }
  53.     
  54.     /* Page lock the memory.
  55.      */
  56.     //GlobalPageLock((HGLOBAL)HIWORD(lpBuf));
  57.  
  58.     /* Save the handle.
  59.      */
  60.     lpBuf->hSelf = hMem;
  61.  
  62.     return lpBuf;
  63. }
  64.  
  65. /* FreeCallbackInstanceData - Frees the given CALLBACKINSTANCEDATA structure.
  66.  *
  67.  * Params:  lpBuf - Points to the CALLBACKINSTANCEDATA structure to be freed.
  68.  *
  69.  * Return:  void
  70.  */
  71. void FAR PASCAL FreeCallbackInstanceData(LPCALLBACKINSTANCEDATA lpBuf)
  72. {
  73.     HANDLE hMem;
  74.  
  75.     /* Save the handle until we're through here.
  76.      */
  77.     hMem = lpBuf->hSelf;
  78.  
  79.     /* Free the structure.
  80.      */
  81.     //GlobalPageUnlock((HGLOBAL)HIWORD(lpBuf));
  82.     GlobalUnlock(hMem);
  83.     GlobalFree(hMem);
  84. }
  85.