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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  M S P G L E . C
  3.  *
  4.  *  Code for implementing the GetLastError method of all store
  5.  *  objects.
  6.  *
  7.  *  Copyright 1992-1995 Microsoft Corporation.  All Rights Reserved.
  8.  */
  9. #include "msp.h"
  10. #include "msprc.h"
  11. /* Manifest constants */
  12. #define STRING_MAX      128
  13. /* Global variables */
  14. /* The following array maps a string identifier (IDS) to status code */
  15. /* (SCODE).  The order of SCODEs in the array has an external        */
  16. /* dependency:  the order of elements in the array is dictated by    */
  17. /* the IDS definitions in msprc.h.  This implicit association must   */
  18. /* be maintained for the strings associated with string identifiers  */
  19. /* to make sense.  Thus, if either this structure or the one in      */
  20. /* msprc.h changes, the other must change to match it.               */
  21. SCODE mpIdsScode[] =
  22. {
  23.     S_OK,
  24.     MAPI_E_NO_ACCESS,
  25.     E_NOINTERFACE,
  26.     E_INVALIDARG,
  27.     MAPI_E_CALL_FAILED,
  28.     MAPI_E_NOT_FOUND,
  29.     MAPI_E_NO_SUPPORT,
  30.     MAPI_W_ERRORS_RETURNED,
  31.     MAPI_W_PARTIAL_COMPLETION,
  32.     MAPI_E_BAD_CHARWIDTH,
  33.     MAPI_E_BAD_VALUE,
  34.     MAPI_E_BUSY,
  35.     MAPI_E_COLLISION,
  36.     MAPI_E_COMPUTED,
  37.     MAPI_E_CORRUPT_DATA,
  38.     MAPI_E_CORRUPT_STORE,
  39.     MAPI_E_DISK_ERROR,
  40.     MAPI_E_HAS_FOLDERS,
  41.     MAPI_E_HAS_MESSAGES,
  42.     MAPI_E_INVALID_ENTRYID,
  43.     MAPI_E_INVALID_OBJECT,
  44.     MAPI_E_LOGON_FAILED,
  45.     MAPI_E_NETWORK_ERROR,
  46.     MAPI_E_NON_STANDARD,
  47.     MAPI_E_NOT_ENOUGH_DISK,
  48.     MAPI_E_NOT_ENOUGH_MEMORY,
  49.     MAPI_E_NOT_ENOUGH_RESOURCES,
  50.     MAPI_E_NOT_IN_QUEUE,
  51.     MAPI_E_OBJECT_CHANGED,
  52.     MAPI_E_OBJECT_DELETED,
  53.     MAPI_E_STRING_TOO_LONG,
  54.     MAPI_E_SUBMITTED,
  55.     MAPI_E_TOO_BIG,
  56.     MAPI_E_UNABLE_TO_ABORT,
  57.     MAPI_E_UNCONFIGURED,
  58.     MAPI_E_UNEXPECTED_TYPE,
  59.     MAPI_E_UNKNOWN_FLAGS,
  60.     MAPI_E_USER_CANCEL,
  61.     MAPI_E_VERSION
  62. };
  63. /*
  64.  *  Exported functions
  65.  */
  66. /*
  67.  *  MapScodeSz
  68.  *
  69.  *  Purpose:
  70.  *      Look up an SCODE in a mapping of IDS <-> SCODE to find its
  71.  *      associated informational string and return it (with memory
  72.  *      allocated by this function) to the caller.
  73.  *
  74.  *  Arguments:
  75.  *      scArg       The SCODE to look up.
  76.  *      pims        Pointer to the message store object (where we
  77.  *                  obtain the memory allocation functions).
  78.  *      lppszError  Location in which to place an address to a
  79.  *                  newly allocated buffer containing the
  80.  *                  informational string associated with scArg.
  81.  *
  82.  *  Returns:
  83.  *      HRESULT
  84.  *
  85.  *  Side effects:
  86.  *      None.
  87.  *
  88.  *  Errors:
  89.  *      MAPI_E_NOT_ENOUGH_MEMORY    Could not allocate space for
  90.  *                                  the return string.
  91.  */
  92. HRESULT MapScodeSz(SCODE scArg, PIMS pims, LPTSTR * lppszError)
  93. {
  94.     HRESULT hr = hrSuccess;
  95.     SCODE sc = SUCCESS_SUCCESS;
  96.     UINT ui = 0;
  97.     UINT uiMax = 0;
  98.     LPTSTR szErr = NULL;
  99.     TCHAR rgch[STRING_MAX];
  100.     AssertSz(lppszError, "Bad lppszErrorn");
  101.     /* Linear search in mpIdsScode for scArg.  When found, index is IDS. */
  102.     uiMax = sizeof mpIdsScode / sizeof mpIdsScode[0];
  103.     for (ui = 0; ui < uiMax; ui++)
  104.     {
  105.         if (mpIdsScode[ui] == scArg)
  106.             break;
  107.     }
  108.     /* If we didn't find the string, return a NULL string. */
  109.     if (ui == uiMax)
  110.         rgch[0] = (TCHAR) 0;
  111.     else
  112.     {
  113.         /* Get the string from the resource.  Note:  the assumption that   */
  114.         /* rgch is large enough to hold the largest string that LoadString */
  115.         /* could return can be checked by looking at the resource strings  */
  116.         /* file, msp.rc                                                    */
  117.         int iLS = 0;
  118.     
  119.         Assert(pims->pmsp);
  120.     
  121.         iLS = LoadString(pims->pmsp->hInst, ui, rgch, STRING_MAX);
  122.         AssertSz(iLS, "Unknown string identifier!");
  123.         AssertSz(iLS < STRING_MAX-1, "String resource truncated!");
  124.     }
  125.     /* Allocate memory for return variable and set it */
  126.     sc = LMAlloc(&pims->lmr, Cbtszsize(rgch), &szErr);
  127.     if (sc != S_OK)
  128.     {
  129.         hr = ResultFromScode(sc);
  130.         goto exit;
  131.     }
  132.     lstrcpy(szErr, rgch);
  133.     *lppszError = szErr;
  134. exit:
  135.     DebugTraceResult(MapScodeSz, hr);
  136.     return hr;
  137. }