MAPIAPP.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:24k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /* QuickCase:W KNB Version 1.00 */
  2. #include "MAPIAPP.h"
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include "mapi.h"
  6. #define MAIN 1
  7. #include "mapinit.h"
  8. HANDLE hLibrary;
  9. LHANDLE hMAPISession;
  10. MapiMessage mmMapiMessage;
  11. ULONG nMessageSize = 0x000004000;
  12. lpMapiMessage FAR *lppMessage;
  13. lpMapiMessage lpMessage;
  14. char szSeedMessageID[512];
  15. char szMessageID[512];
  16. char szSubject[512];
  17. char szNoteText[4096];
  18. LPSTR lpszSeedMessageID = &szSeedMessageID[0];
  19. LPSTR lpszMessageID = &szMessageID[0];
  20. LPSTR pszSubject = &szSubject[0];
  21. LPSTR pszNoteText = &szNoteText[0];
  22. LPSTR pszDateReceived = "1991/03/23 12:00";
  23. MapiRecipDesc rdOriginator = { 0L,MAPI_ORIG,(LPSTR)"ONE",NULL};
  24. int iFindFirst= TRUE;
  25. void InitMessage(lpMapiMessage pmmMessage)
  26. {
  27.   pmmMessage->ulReserved = 0L;
  28.   pmmMessage->lpszSubject =pszSubject;
  29.   pmmMessage->lpszNoteText =pszNoteText;
  30.   pmmMessage->lpszMessageType = NULL;
  31.   pmmMessage->lpszDateReceived = pszDateReceived;
  32.   pmmMessage->flFlags = MAPI_UNREAD;
  33.   pmmMessage->lpOriginator = &rdOriginator;
  34.   pmmMessage->nRecipCount = 0L;
  35.   pmmMessage->lpRecips = NULL;
  36.   pmmMessage->nFileCount = 0L;
  37.   pmmMessage->lpFiles = NULL;
  38. }
  39. /****************************************************************************
  40.     FUNCTION: OutOfMemory(void)
  41.     PURPOSE:  Displays warning message
  42. ****************************************************************************/
  43. void OutOfMemory(void)
  44. {
  45.     MessageBox(
  46.         GetFocus(),
  47.         GetStringRes (IDS_ERR_NO_MEMORY),
  48.         NULL,
  49.         MB_ICONHAND | MB_SYSTEMMODAL);
  50.     return;
  51. }
  52. void mycpystr(char * npszStrg, LPSTR lpszStrg)
  53. {
  54.   if (lpszStrg != NULL)
  55.     strcpy(npszStrg, lpszStrg);
  56.   else
  57.      *npszStrg = '';
  58. }
  59. /************************************************************************/
  60. /*                                                                      */
  61. /* Windows 3.0 Main Program Body                                        */
  62. /*                                                                      */
  63. /* The following routine is the Windows Main Program.  The Main Program */
  64. /* is executed when a program is selected from the Windows Control      */
  65. /* Panel or File Manager.  The WinMain routine registers and creates    */
  66. /* the program's main window and initializes global objects.  The       */
  67. /* WinMain routine also includes the applications message dispatch      */
  68. /* loop.  Every window message destined for the main window or any      */
  69. /* subordinate windows is obtained, possibly translated, and            */
  70. /* dispatched to a window or dialog processing function. The dispatch   */
  71. /* loop is exited when a WM_QUIT message is obtained.  Before exiting   */
  72. /* the WinMain routine should destroy any objects created and free      */
  73. /* memory and other resources.                                          */
  74. /*                                                                      */
  75. /************************************************************************/
  76. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
  77. {
  78.  /***********************************************************************/
  79.  /* HANDLE hInstance;       handle for this instance                    */
  80.  /* HANDLE hPrevInstance;   handle for possible previous instances      */
  81.  /* LPSTR  lpszCmdLine;     long pointer to exec command line           */
  82.  /* int    nCmdShow;        Show code for main window display           */
  83.  /***********************************************************************/
  84.  MSG        msg;           /* MSG structure to store your messages        */
  85.  int        nRc;           /* return value from Register Classes          */
  86.  long       nWndunits;     /* window units for size and location          */
  87.  int        nWndx;         /* the x axis multiplier                       */
  88.  int        nWndy;         /* the y axis multiplier                       */
  89.  int        nX;            /* the resulting starting point (x, y)         */
  90.  int        nY;
  91.  int        nWidth;        /* the resulting width and height for this     */
  92.  int        nHeight;       /* window                                      */
  93.  strcpy(szAppName, "MAPIAPP");
  94.  hInst = hInstance;
  95.  if(!hPrevInstance)
  96.    {
  97.     /* register window classes if first instance of application         */
  98.     if ((nRc = nCwRegisterClasses()) == -1)
  99.       {
  100.        /* registering one of the windows failed                         */
  101.        LoadString(hInst, IDS_ERR_REGISTER_CLASS, szString, sizeof(szString));
  102.        MessageBox(NULL, szString, NULL, MB_ICONEXCLAMATION);
  103.        return nRc;
  104.       }
  105.    }
  106.  /* Create a device independant size and location                       */
  107.  nWndunits = GetDialogBaseUnits();
  108.  nWndx = LOWORD(nWndunits);
  109.  nWndy = HIWORD(nWndunits);
  110.  nX = ((60 * nWndx) / 4);
  111.  nY = ((60 * nWndy) / 8);
  112.  nWidth = ((197 * nWndx) / 4);
  113.  nHeight = ((138 * nWndy) / 8);
  114.  /* create application's Main window                                    */
  115.  hWndMain = CreateWindow(
  116.                 szAppName,               /* Window class name           */
  117. GetStringRes (IDS_APP_TITLE),  /* Window's title        */
  118.                 WS_CAPTION      |        /* Title and Min/Max           */
  119.                 WS_SYSMENU      |        /* Add system menu box         */
  120.                 WS_MINIMIZEBOX  |        /* Add minimize box            */
  121.                 WS_MAXIMIZEBOX  |        /* Add maximize box            */
  122.                 WS_BORDER       |        /* thin frame                  */
  123.                 WS_CLIPCHILDREN |        /* don't draw in child windows areas */
  124.                 WS_OVERLAPPED,
  125.                 nX, nY,                  /* X, Y                        */
  126.                 nWidth, nHeight,         /* Width, Height of window     */
  127.                 NULL,                    /* Parent window's handle      */
  128.                 NULL,                    /* Default to Class Menu       */
  129.                 hInst,                   /* Instance of window          */
  130.                 NULL);                   /* Create struct for WM_CREATE */
  131.  if (InitMAPI() != 0)
  132.    return ERR_LOAD_LIB;
  133.   InitMessage(&mmMapiMessage);
  134.  if(hWndMain == NULL)
  135.    {
  136.     LoadString(hInst, IDS_ERR_CREATE_WINDOW, szString, sizeof(szString));
  137.     MessageBox(NULL, szString, NULL, MB_ICONEXCLAMATION);
  138.     return IDS_ERR_CREATE_WINDOW;
  139.    }
  140.  EnableMenuItem(GetMenu(hWndMain), IDM_A_LOGOFF, MF_DISABLED | MF_GRAYED);
  141.  EnableMenuItem(GetMenu(hWndMain), IDM_S_MAIL, MF_DISABLED | MF_GRAYED);
  142.  EnableMenuItem(GetMenu(hWndMain), IDM_S_DOCUMENT, MF_DISABLED | MF_GRAYED);
  143.  EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDFIRST, MF_DISABLED | MF_GRAYED);
  144.  EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_DISABLED | MF_GRAYED);
  145.  EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
  146.  EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
  147.  ShowWindow(hWndMain, nCmdShow);            /* display main window      */
  148.  while(GetMessage(&msg, NULL, 0, 0))        /* Until WM_QUIT message    */
  149.    {
  150.     TranslateMessage(&msg);
  151.     DispatchMessage(&msg);
  152.    }
  153.  DeInitMAPI();
  154.  /* Do clean up before exiting from the application                     */
  155.  CwUnRegisterClasses();
  156.  return msg.wParam;
  157. } /*  End of WinMain                                                    */
  158. /************************************************************************/
  159. /*                                                                      */
  160. /* Main Window Procedure                                                */
  161. /*                                                                      */
  162. /* This procedure provides service routines for the Windows events      */
  163. /* (messages) that Windows sends to the window, as well as the user     */
  164. /* initiated events (messages) that are generated when the user selects */
  165. /* the action bar and pulldown menu controls or the corresponding       */
  166. /* keyboard accelerators.                                               */
  167. /*                                                                      */
  168. /* The SWITCH statement shown below distributes the window messages to  */
  169. /* the respective message service routines, which are set apart by the  */
  170. /* CASE statements. The window procedures must provide an appropriate   */
  171. /* service routine for its end user initiated messages, as well as the  */
  172. /* general Windows messages (ie. WM_CLOSE message). If a message is     */
  173. /* sent to this procedure for which there is no programmed CASE clause  */
  174. /* (i.e., no service routine), the message is defaulted to the          */
  175. /* DefWindowProc function, where it is handled by Windows               */
  176. /*                                                                      */
  177. /* For the end-user initiated messages, this procedure is concerned     */
  178. /* principally with the WM_COMMAND message. The menu control ID (or the */
  179. /* corresponding accelerator ID) is communicated to this procedure in   */
  180. /* the first message parameter (wParam). The window procedure provides  */
  181. /* a major CASE statement for the WM_COMMAND message and a subordinate  */
  182. /* SWITCH statement to provide CASE clauses for the message service     */
  183. /* routines for the various menu item's, identified by their ID values. */
  184. /*                                                                      */
  185. /* The message service routines for the individual menu items are the   */
  186. /* main work points in the program. These service routines contain the  */
  187. /* units of work performed when the end user select one of the menu     */
  188. /* controls. The required application response to a menu control is     */
  189. /* programmed in its associated CASE clause. The service routines may   */
  190. /* contain subroutine calls to separately compiled and libraried        */
  191. /* routines, in-line calls to subroutines to be embodied in this source */
  192. /* code module, or program statements entered directly in the CASE      */
  193. /* clauses. Program control is switched to the appropriate service      */
  194. /* routine when Windows recognizes the end user event and sends a WM_COMMAND */
  195. /* message to the window procedure. The service routine provides the    */
  196. /* appropriate application-specific response to the end user initiated  */
  197. /* event, then breaks to return control to the WinMain() routine which  */
  198. /* continues to service the message queue of the window(s).             */
  199. /*                                                                      */
  200. /************************************************************************/
  201. LONG FAR PASCAL WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
  202. {
  203.  HMENU      hMenu=0;            /* handle for the menu                 */
  204.  HBITMAP    hBitmap=0;          /* handle for bitmaps                  */
  205.  HDC        hDC;                /* handle for the display device       */
  206.  PAINTSTRUCT ps;                /* holds PAINT information             */
  207.  int        nRc=0;              /* return code                         */
  208.  FLAGS flFlag = 0L;
  209.  ULONG ulResult;
  210.   char szBuf[32*1024]; // Waste of stack space, but this is only a demo.
  211.   char szTmp[32*1024]; // Waste of stack space, but this is only a demo.
  212.  switch (Message) {
  213.    case WM_COMMAND:
  214.      /* The Windows messages for action bar and pulldown menu items */
  215.      /* are processed here.                                         */
  216.      /* The WM_COMMAND message contains the message ID in its first */
  217.      /* parameter (wParam). This routine is programmed to SWITCH on */
  218.      /* the #define values generated by CASE:W for the menu items   */
  219.      /* in the application's header (*.H) file. The ID values have  */
  220.      /* the format, IDM_itemname. The service routines for the      */
  221.      /* various menu items follow the CASE statements up to the     */
  222.      /* generated BREAK statements.                                 */
  223.      switch (LOWORD(wParam)) {
  224.        case IDM_A_LOGON:
  225.             /* Place User Code to respond to the                   */
  226.             /* Menu Item Named "Log&In" here.                      */
  227.          flFlag =MAPI_NEW_SESSION | MAPI_LOGON_UI;
  228.          ulResult = (*lpfnMAPILogon)(hWnd, NULL, NULL, flFlag, 0L, (LPLHANDLE)&hMAPISession);
  229.          if (ulResult == 0L) {
  230.            EnableMenuItem(GetMenu(hWndMain), IDM_A_LOGOFF, MF_ENABLED);
  231.            EnableMenuItem(GetMenu(hWndMain), IDM_S_MAIL, MF_ENABLED);
  232.            EnableMenuItem(GetMenu(hWndMain), IDM_S_DOCUMENT, MF_ENABLED);
  233.            EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDFIRST, MF_ENABLED);
  234.            EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_ENABLED);
  235.          }
  236.        break;
  237.        case IDM_A_LOGOFF:
  238.             /* Place User Code to respond to the                   */
  239.             /* Menu Item Named "Log&Off" here.                     */
  240.          ulResult = (*lpfnMAPILogoff)(hMAPISession, hWnd, 0L, 0L);
  241.          if (ulResult == 0L) {
  242.             EnableMenuItem(GetMenu(hWndMain), IDM_A_LOGOFF, MF_DISABLED | MF_GRAYED);
  243.              EnableMenuItem(GetMenu(hWndMain), IDM_S_MAIL, MF_DISABLED | MF_GRAYED);
  244.              EnableMenuItem(GetMenu(hWndMain), IDM_S_DOCUMENT, MF_DISABLED | MF_GRAYED);
  245.              EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDFIRST, MF_DISABLED | MF_GRAYED);
  246.              EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_DISABLED | MF_GRAYED);
  247.              EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
  248.              EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
  249.          }
  250.        break;
  251.        case IDM_S_MAIL:
  252.             /* Place User Code to respond to the                   */
  253.             /* Menu Item Named "&Mail" here.                       */
  254.           flFlag =MAPI_DIALOG;
  255.          ulResult = (*lpfnMAPISendMail)(hMAPISession, hWnd, &mmMapiMessage, flFlag, 0L);
  256.        break;
  257.        case IDM_S_DOCUMENT:
  258.             /* Place User Code to respond to the                   */
  259.             /* Menu Item Named "&Document" here.                   */
  260.          ulResult = (*lpfnMAPISendDocuments)(hWnd, ";", "C:\CONFIG.SYS", "CONFIG.SYS", 0L);
  261.        break;
  262.        case IDM_M_FINDFIRST:
  263.            iFindFirst=TRUE;
  264.        case IDM_M_FINDNEXT:
  265.             /* Place User Code to respond to the                   */
  266.             /* Menu Item Named "&Find Next" here.                  */
  267.          if (iFindFirst) {
  268.            *lpszSeedMessageID = '';
  269.            iFindFirst = FALSE;
  270.          }
  271.          else {
  272.            strcpy(lpszSeedMessageID,lpszMessageID);
  273.          }
  274.          ulResult = (*lpfnMAPIFindNext)(hMAPISession, hWnd, NULL, lpszSeedMessageID, flFlag, 0L, lpszMessageID);
  275.          if (ulResult == 0L) {
  276.            EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_ENABLED);
  277.            EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_ENABLED);
  278.            EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_ENABLED);
  279.          }
  280.          else {
  281.            EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_DISABLED | MF_GRAYED);
  282.            EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
  283.            EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
  284.          }
  285.        break;
  286.        case IDM_M_READ:
  287.             /* Place User Code to respond to the                   */
  288.             /* Menu Item Named "&Read" here.                       */
  289.            lppMessage= (lpMapiMessage FAR *) &lpMessage;
  290.            ulResult = (*lpfnMAPIReadMail)(hMAPISession, hWnd, lpszMessageID, flFlag, 0L, lppMessage);
  291.            if (ulResult == 0L) {
  292.              mycpystr(szTmp,lpMessage->lpOriginator->lpszName);
  293.  sprintf(szBuf, GetStringRes(IDS_FROM), szTmp);
  294.              mycpystr(szTmp,lpMessage->lpRecips[0].lpszName);
  295.              sprintf(szBuf, GetStringRes(IDS_TO), szBuf,szTmp);
  296.              mycpystr(szTmp,lpMessage->lpszDateReceived);
  297.              sprintf(szBuf, GetStringRes(IDS_DATE), szBuf,szTmp);
  298.              mycpystr(szTmp,lpMessage->lpszSubject);
  299.  sprintf(szBuf, GetStringRes(IDS_SUBJECT), szBuf,szTmp);
  300.  mycpystr(szTmp,lpMessage->lpszNoteText);
  301.  sprintf(szBuf,"%s%s",szBuf,szTmp);
  302.              
  303.  MessageBox(hWnd,szBuf, GetStringRes(IDS_MESSAGE), MB_OK);
  304.              ulResult = lpfnMAPIFreeBuffer((LPVOID)lpMessage);
  305.            }
  306.        break;
  307.        case IDM_M_DELETE:
  308.             /* Place User Code to respond to the                   */
  309.             /* Menu Item Named "&Delete" here.                  */
  310.          ulResult = (*lpfnMAPIDeleteMail)(hMAPISession, hWnd, lpszMessageID, flFlag, 0l);
  311.          if (ulResult == 0L) {
  312.            EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
  313.            EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
  314.          }
  315.        break;
  316.        default:
  317.          return DefWindowProc(hWnd, Message, wParam, lParam);
  318.      }
  319.      if (ulResult != 0L) {       /** oops **/
  320.        sprintf(szBuf, GetStringRes(IDS_RETURNED_ERROR), ulResult);
  321.        MessageBox(hWnd,szBuf, GetStringRes(IDS_FAILED),MB_OK);
  322.      }
  323.      else {
  324.        sprintf(szBuf, GetStringRes(IDS_GOOD_JOB));
  325.        MessageBox(hWnd,szBuf, GetStringRes(IDS_SUCCESS), MB_OK);
  326.      }
  327.    break;        /* End of WM_COMMAND                             */
  328.    case WM_CREATE:
  329.      /* The WM_CREATE message is sent once to a window when the     */
  330.      /* window is created.  The window procedure for the new window */
  331.      /* receives this message after the window is created, but      */
  332.      /* before the window becomes visible.                          */
  333.      /*                                                             */
  334.      /* Parameters:                                                 */
  335.      /*                                                             */
  336.      /*    lParam  -  Points to a CREATESTRUCT structure with       */
  337.      /*               the following form:                           */
  338.      /*                                                             */
  339.      /*    typedef struct                                           */
  340.      /*              {                                              */
  341.      /*               LPSTR     lpCreateParams;                     */
  342.      /*               HANDLE    hInst;                              */
  343.      /*               HANDLE    hMenu;                              */
  344.      /*               HWND      hwndParent;                         */
  345.      /*               int       cy;                                 */
  346.      /*               int       cx;                                 */
  347.      /*               int       y;                                  */
  348.      /*               int       x;                                  */
  349.      /*               LONG      style;                              */
  350.      /*               LPSTR     lpszName;                           */
  351.      /*               LPSTR     lpszClass;                          */
  352.      /*               DWORD     dwExStyle;                          */
  353.      /*              }  CREATESTRUCT;                               */
  354.    break;       /*  End of WM_CREATE                              */
  355.    case WM_MOVE:     /*  code for moving the window                    */
  356.    break;
  357.    case WM_SIZE:     /*  code for sizing client area                   */
  358.         /* wParam contains a code indicating the requested sizing      */
  359.         /* lParam contains the new height and width of the client area */
  360.    break;       /* End of WM_SIZE                                 */
  361.    case WM_PAINT:    /* code for the window's client area              */
  362.      /* Obtain a handle to the device context                       */
  363.      /* BeginPaint will sends WM_ERASEBKGND if appropriate          */
  364.      memset(&ps, 0x00, sizeof(PAINTSTRUCT));
  365.      hDC = BeginPaint(hWnd, &ps);
  366.      /* Included in case the background is not a pure color         */
  367.      SetBkMode(hDC, TRANSPARENT);
  368.      /* Application should draw on the client window using          */
  369.      /* the GDI graphics and text functions.  'ps' the PAINTSTRUCT  */
  370.      /* returned by BeginPaint contains a rectangle to the          */
  371.      /* area that must be repainted.                                */
  372.      /* Inform Windows painting is complete                         */
  373.      EndPaint(hWnd, &ps);
  374.    break;       /*  End of WM_PAINT                               */
  375.    case WM_CLOSE:  /* close the window                                 */
  376.      /* Destroy child windows, modeless dialogs, then, this window  */
  377.      DestroyWindow(hWnd);
  378.      if (hWnd == hWndMain)
  379.        PostQuitMessage(0);  /* Quit the application                 */
  380.    break;
  381.    default:
  382.         /* For any message for which you don't specifically provide a  */
  383.         /* service routine, you should return the message to Windows   */
  384.         /* for default message processing.                             */
  385.      return DefWindowProc(hWnd, Message, wParam, lParam);
  386.  }
  387.  return 0L;
  388. }     /* End of WndProc                                         */
  389. /************************************************************************/
  390. /*                                                                      */
  391. /* nCwRegisterClasses Function                                          */
  392. /*                                                                      */
  393. /* The following function registers all the classes of all the windows  */
  394. /* associated with this application. The function returns an error code */
  395. /* if unsuccessful, otherwise it returns 0.                             */
  396. /*                                                                      */
  397. /************************************************************************/
  398. int nCwRegisterClasses(void)
  399. {
  400.  WNDCLASS   wndclass;    /* struct to define a window class             */
  401.  memset(&wndclass, 0x00, sizeof(WNDCLASS));
  402.  /* load WNDCLASS with window's characteristics                         */
  403.  wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW;
  404.  wndclass.lpfnWndProc = WndProc;
  405.  /* Extra storage for Class and Window objects                          */
  406.  wndclass.cbClsExtra = 0;
  407.  wndclass.cbWndExtra = 0;
  408.  wndclass.hInstance = hInst;
  409.  wndclass.hIcon = LoadIcon(hInst, "MAPIAPP");
  410.  wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  411.  /* Create brush for erasing background                                 */
  412.  wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  413.  wndclass.lpszMenuName = szAppName;   /* Menu Name is App Name */
  414.  wndclass.lpszClassName = szAppName; /* Class Name is App Name */
  415.  if(!RegisterClass(&wndclass))
  416.    return -1;
  417.  return(0);
  418. } /* End of nCwRegisterClasses                                          */
  419. /************************************************************************/
  420. /*  CwUnRegisterClasses Function                                        */
  421. /*                                                                      */
  422. /*  Deletes any refrences to windows resources created for this         */
  423. /*  application, frees memory, deletes instance, handles and does       */
  424. /*  clean up prior to exiting the window                                */
  425. /*                                                                      */
  426. /************************************************************************/
  427. void CwUnRegisterClasses(void)
  428. {
  429.  WNDCLASS   wndclass;    /* struct to define a window class             */
  430.  memset(&wndclass, 0x00, sizeof(WNDCLASS));
  431.  UnregisterClass(szAppName, hInst);
  432. }    /* End of CwUnRegisterClasses                                      */
  433. //---------------------------------------------------------------------------
  434. //
  435. // FUNCTION:    GetStringRes (int id INPUT ONLY)
  436. //
  437. // COMMENTS:    Load the resource string with the ID given, and return a
  438. //              pointer to it.  Notice that the buffer is common memory so
  439. //              the string must be used before this call is made a second time.
  440. //
  441. //---------------------------------------------------------------------------
  442. LPTSTR GetStringRes (int id)
  443. {
  444.   static TCHAR buffer[MAX_PATH];
  445.   buffer[0]=0;
  446.   LoadString (GetModuleHandle (NULL), id, buffer, MAX_PATH);
  447.   return buffer;
  448. }