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

Windows编程

开发平台:

Visual C++

  1. /***********************************************************************
  2.  *
  3.  *  WRAP.C
  4.  *
  5.  *  Sample Address Book Wrap object
  6.  *  This file contains the code for implementing the Sample AB
  7.  *  WRAP object.
  8.  *
  9.  *  This file contains methods with "default" actions for objects which
  10.  *  expose IUnknown and/or IMAPIProp.  These "default" actions are to call
  11.  *  the appropriate method of a "wrapped" object that is a member of this
  12.  *  object.  Various methods in this file are used throughout this sample
  13.  *  provider and are especially useful with the objects that implement template
  14.  *  ids (see TID.C and OOTID.C).
  15.  *
  16.  *  Copyright 1992-1995 Microsoft Corporation.  All Rights Reserved.
  17.  *
  18.  ***********************************************************************/
  19. #include "abp.h"
  20. typedef struct _WRAP {
  21.     WRAP_Vtbl * lpVtbl;
  22.     SAB_Wrapped;
  23.     
  24. } WRAP, *LPWRAP;
  25. /*********************************************************************
  26.  *
  27.  *  The actual Wrapped IMAPIProp methods
  28.  *
  29.  */
  30. STDMETHODIMP
  31. WRAP_QueryInterface(LPWRAP lpWRAP,
  32.                     REFIID lpiid,
  33.                     LPVOID * lppNewObj)
  34. {
  35.     HRESULT hr;
  36.     /*
  37.      *  Check to see if it has a lpVtbl object member
  38.      */
  39.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  40.     {
  41.         /*
  42.          *  No jump table found
  43.          */
  44.         return ResultFromScode(E_INVALIDARG);
  45.     }
  46.     /*
  47.      *  Check to see that the Vtbl is large enough to include this method
  48.      */
  49.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  50.                      offsetof(WRAP_Vtbl, QueryInterface)+sizeof(WRAP_QueryInterface_METHOD *)))
  51.     {
  52.         /*
  53.          *  Jump table not derived from IUnknown
  54.          */
  55.         return ResultFromScode(E_INVALIDARG);
  56.     }
  57.     /*
  58.      *  Check to see if the method is the same
  59.      */
  60.     if (WRAP_QueryInterface != lpWRAP->lpVtbl->QueryInterface)
  61.     {
  62.         /*
  63.          *  Wrong object - the object passed doesn't have this
  64.          *  method.
  65.          */
  66.         return ResultFromScode(E_INVALIDARG);
  67.     }
  68.     EnterCriticalSection(&lpWRAP->cs);
  69.     /*  Call the internal prop interface */
  70.     hr = lpWRAP->lpPropData->lpVtbl->QueryInterface(
  71.         lpWRAP->lpPropData,
  72.         lpiid,
  73.         lppNewObj);
  74.     /*  If this object is successful in QI'ing and it returns exactly the
  75.      *  same object, then I need to AddRef my own "wrapper" object so that
  76.      *  my release code works correctly AND replace the *lppNewObj with the
  77.      *  "wrapper" object.
  78.      */
  79.     if (!HR_FAILED(hr) && (lpWRAP->lpPropData == *lppNewObj))
  80.     {
  81.         ++lpWRAP->lcInit;
  82.         *lppNewObj = lpWRAP;
  83.     }
  84.     LeaveCriticalSection(&lpWRAP->cs);
  85.     return hr;
  86. }
  87. STDMETHODIMP_(ULONG) WRAP_AddRef(LPWRAP lpWRAP)
  88. {
  89.     ULONG ulRet;
  90.     /*
  91.      *  Check to see if it has a lpVtbl object member
  92.      */
  93.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  94.     {
  95.         /*
  96.          *  No jump table found
  97.          */
  98.         return 1;
  99.     }
  100.     /*
  101.      *  Check to see that the Vtbl is large enough to include this method
  102.      */
  103.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  104.                      offsetof(WRAP_Vtbl, AddRef)+sizeof(WRAP_AddRef_METHOD *)))
  105.     {
  106.         /*
  107.          *  Jump table not derived from IUnknown
  108.          */
  109.         return 1;
  110.     }
  111.     /*
  112.      *  Check to see if the method is the same
  113.      */
  114.     if (WRAP_AddRef != lpWRAP->lpVtbl->AddRef)
  115.     {
  116.         /*
  117.          *  Wrong object - the object passed doesn't have this
  118.          *  method.
  119.          */
  120.         return 1;
  121.     }
  122.     EnterCriticalSection(&lpWRAP->cs);
  123.     ++lpWRAP->lcInit;
  124.     /*  Call the internal prop interface */
  125.     ulRet = lpWRAP->lpPropData->lpVtbl->AddRef(lpWRAP->lpPropData);
  126.     
  127.     LeaveCriticalSection(&lpWRAP->cs);
  128.     return ulRet;
  129. }
  130. STDMETHODIMP_(ULONG) WRAP_Release(LPWRAP lpWRAP)
  131. {
  132.     long lcInit;
  133.     /*
  134.      *  Check to see if it has a lpVtbl object member
  135.      */
  136.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  137.     {
  138.         /*
  139.          *  No jump table found
  140.          */
  141.         return 1;
  142.     }
  143.     /*
  144.      *  Check to see that the Vtbl is large enough to include this method
  145.      */
  146.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  147.                      offsetof(WRAP_Vtbl, Release)+sizeof(WRAP_Release_METHOD *)))
  148.     {
  149.         /*
  150.          *  Jump table not derived from IUnknown
  151.          */
  152.         return 1;
  153.     }
  154.     /*
  155.      *  Check to see if the method is the same
  156.      */
  157.     if (WRAP_Release != lpWRAP->lpVtbl->Release)
  158.     {
  159.         /*
  160.          *  Wrong object - the object passed doesn't have this
  161.          *  method.
  162.          */
  163.         return 1;
  164.     }
  165.     EnterCriticalSection(&lpWRAP->cs);
  166.     /*
  167.      *  Release the imapiprop object
  168.      */
  169.     lpWRAP->lpPropData->lpVtbl->Release(
  170.         lpWRAP->lpPropData);
  171.     lcInit = --lpWRAP->lcInit;
  172.     LeaveCriticalSection(&lpWRAP->cs);
  173.     if (lcInit == 0)
  174.     {
  175.         /*  
  176.          *  Release our reference to the ABLogon object.
  177.          */
  178.         if (lpWRAP->lpABLogon)
  179.         {
  180.             lpWRAP->lpABLogon->lpVtbl->Release(lpWRAP->lpABLogon);
  181.             lpWRAP->lpABLogon = NULL;
  182.         }
  183.         /*
  184.          *  Get rid of my critical section
  185.          */
  186.         DeleteCriticalSection(&lpWRAP->cs);
  187.         /*
  188.          *  Set the Jump table to NULL.  This way the client will find out
  189.          *  real fast if it's calling a method on a released object.  That is,
  190.          *  the client will crash.  Hopefully, this will happen during the
  191.          *  development stage of the client.
  192.          */
  193.         lpWRAP->lpVtbl = NULL;
  194.         /*
  195.          *  Need to free the object
  196.          */
  197.         lpWRAP->lpFreeBuff(lpWRAP);
  198.         return 0;
  199.     }
  200.     return lcInit;
  201. }
  202. STDMETHODIMP
  203. WRAP_GetLastError(  LPWRAP lpWRAP,
  204.                     HRESULT hError,
  205.                     ULONG ulFlags,
  206.                     LPMAPIERROR FAR * lppMapiError )
  207. {
  208.     HRESULT hResult;
  209.     /*
  210.      *  Check to see if it has a lpVtbl object member
  211.      */
  212.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  213.     {
  214.         /*
  215.          *  No jump table found
  216.          */
  217.         hResult = ResultFromScode(E_INVALIDARG);
  218.         return hResult;
  219.     }
  220.     /*
  221.      *  Check to see that the Vtbl is large enough to include this method
  222.      */
  223.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  224.         offsetof(WRAP_Vtbl, GetLastError)+sizeof(WRAP_GetLastError_METHOD *)))
  225.     {
  226.         /*
  227.          *  Jump table not derived from IUnknown
  228.          */
  229.         hResult = ResultFromScode(E_INVALIDARG);
  230.         return hResult;
  231.     }
  232.     /*
  233.      *  Check to see if the method is the same
  234.      */
  235.     if (WRAP_GetLastError != lpWRAP->lpVtbl->GetLastError)
  236.     {
  237.         /*
  238.          *  Wrong object - the object passed doesn't have this
  239.          *  method.
  240.          */
  241.         hResult = ResultFromScode(E_INVALIDARG);
  242.         return hResult;
  243.     }
  244.     if ( ulFlags & ~MAPI_UNICODE )
  245.     {
  246.         hResult = ResultFromScode( MAPI_E_UNKNOWN_FLAGS );
  247.         return hResult ;
  248.     }
  249.     
  250.     if ( ulFlags & MAPI_UNICODE )
  251.     {
  252.         hResult = ResultFromScode( MAPI_E_BAD_CHARWIDTH );
  253.         return hResult;
  254.     }
  255.     
  256.     return lpWRAP->lpPropData->lpVtbl->GetLastError(
  257.         lpWRAP->lpPropData,
  258.         hError,
  259.         ulFlags,
  260.         lppMapiError );
  261. }
  262. /* IProperty */
  263. STDMETHODIMP
  264. WRAP_SaveChanges(   LPWRAP lpWRAP,
  265.                     ULONG ulFlags)
  266. {
  267.     HRESULT hResult;
  268.     /*
  269.      *  Check to see if it has a lpVtbl object member
  270.      */
  271.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  272.     {
  273.         /*
  274.          *  No jump table found
  275.          */
  276.         hResult = ResultFromScode(E_INVALIDARG);
  277.         return hResult;
  278.     }
  279.     /*
  280.      *  Check to see that the Vtbl is large enough to include this method
  281.      */
  282.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  283.                      offsetof(WRAP_Vtbl, SaveChanges)+sizeof(WRAP_SaveChanges_METHOD *)))
  284.     {
  285.         /*
  286.          *  Jump table not derived from IUnknown
  287.          */
  288.         hResult = ResultFromScode(E_INVALIDARG);
  289.         return hResult;
  290.     }
  291.     /*
  292.      *  Check to see if the method is the same
  293.      */
  294.     if (WRAP_SaveChanges != lpWRAP->lpVtbl->SaveChanges)
  295.     {
  296.         /*
  297.          *  Wrong object - the object passed doesn't have this
  298.          *  method.
  299.          */
  300.         hResult = ResultFromScode(E_INVALIDARG);
  301.         return hResult;
  302.     }
  303.     hResult = lpWRAP->lpPropData->lpVtbl->SaveChanges(
  304.         lpWRAP->lpPropData,
  305.         ulFlags);
  306.     return hResult;
  307. }
  308. STDMETHODIMP
  309. WRAP_GetProps(  LPWRAP lpWRAP,
  310.                 LPSPropTagArray lpPropTagArray,
  311.                 ULONG ulFlags,
  312.                 ULONG * lpcValues,
  313.                 LPSPropValue * lppPropArray)
  314. {
  315.     HRESULT hResult;
  316.     /*
  317.      *  Check to see if it has a lpVtbl object member
  318.      */
  319.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  320.     {
  321.         /*
  322.          *  No jump table found
  323.          */
  324.         hResult = ResultFromScode(E_INVALIDARG);
  325.         return hResult;
  326.     }
  327.     /*
  328.      *  Check to see that the Vtbl is large enough to include this method
  329.      */
  330.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  331.                      offsetof(WRAP_Vtbl, GetProps)+sizeof(WRAP_GetProps_METHOD *)))
  332.     {
  333.         /*
  334.          *  Jump table not derived from IUnknown
  335.          */
  336.         hResult = ResultFromScode(E_INVALIDARG);
  337.         return hResult;
  338.     }
  339.     /*
  340.      *  Check to see if the method is the same
  341.      */
  342.     if (WRAP_GetProps != lpWRAP->lpVtbl->GetProps)
  343.     {
  344.         /*
  345.          *  Wrong object - the object passed doesn't have this
  346.          *  method.
  347.          */
  348.         hResult = ResultFromScode(E_INVALIDARG);
  349.         return hResult;
  350.     }
  351.     if ( ulFlags & ~(MAPI_UNICODE) )
  352.     {
  353.         hResult = ResultFromScode( MAPI_E_UNKNOWN_FLAGS );
  354.         
  355.         return hResult;
  356.     }
  357.     
  358.     if ( ulFlags & MAPI_UNICODE )
  359.     {
  360.         hResult = ResultFromScode( MAPI_E_BAD_CHARWIDTH );
  361.         return hResult;
  362.     }
  363.     return lpWRAP->lpPropData->lpVtbl->GetProps(
  364.         lpWRAP->lpPropData,
  365.         lpPropTagArray,
  366.         ulFlags,
  367.         lpcValues,
  368.         lppPropArray);
  369. }
  370. STDMETHODIMP
  371. WRAP_GetPropList(   LPWRAP lpWRAP,
  372.                     ULONG ulFlags,
  373.                     LPSPropTagArray * lppPropTagArray)
  374. {
  375.     HRESULT hResult = hrSuccess;
  376.     /*
  377.      *  Check to see if it has a lpVtbl object member
  378.      */
  379.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  380.     {
  381.         /*
  382.          *  No jump table found
  383.          */
  384.         hResult = ResultFromScode(E_INVALIDARG);
  385.         return hResult;
  386.     }
  387.     /*
  388.      *  Check to see that the Vtbl is large enough to include this method
  389.      */
  390.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  391.                      offsetof(WRAP_Vtbl, GetPropList)+sizeof(WRAP_GetPropList_METHOD *)))
  392.     {
  393.         /*
  394.          *  Jump table not derived from IUnknown
  395.          */
  396.         hResult = ResultFromScode(E_INVALIDARG);
  397.         return hResult;
  398.     }
  399.     /*
  400.      *  Check to see if the method is the same
  401.      */
  402.     if (WRAP_GetPropList != lpWRAP->lpVtbl->GetPropList)
  403.     {
  404.         /*
  405.          *  Wrong object - the object passed doesn't have this
  406.          *  method.
  407.          */
  408.         hResult = ResultFromScode(E_INVALIDARG);
  409.         return hResult;
  410.     }
  411.     if ( ulFlags & ~(MAPI_UNICODE) )
  412.     {
  413.         hResult = ResultFromScode( MAPI_E_UNKNOWN_FLAGS );
  414.         
  415.         return hResult;
  416.     }
  417.     
  418.     if ( ulFlags & MAPI_UNICODE )
  419.     {
  420.         hResult = ResultFromScode( MAPI_E_BAD_CHARWIDTH );
  421.         return hResult;
  422.     }
  423.     
  424.     return lpWRAP->lpPropData->lpVtbl->GetPropList(
  425.         lpWRAP->lpPropData,
  426.         ulFlags,
  427.         lppPropTagArray);
  428. }
  429. STDMETHODIMP
  430. WRAP_OpenProperty(  LPWRAP lpWRAP,
  431.                     ULONG ulPropTag,
  432.                     LPCIID lpiid,
  433.                     ULONG ulInterfaceOptions,
  434.                     ULONG ulFlags,
  435.                     LPUNKNOWN * lppUnk)
  436. {
  437.     HRESULT hResult;
  438.     /*
  439.      *  Check to see if it has a lpVtbl object member
  440.      */
  441.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  442.     {
  443.         /*
  444.          *  No jump table found
  445.          */
  446.         hResult = ResultFromScode(E_INVALIDARG);
  447.         return hResult;
  448.     }
  449.     /*
  450.      *  Check to see that the Vtbl is large enough to include this method
  451.      */
  452.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  453.                      offsetof(WRAP_Vtbl, OpenProperty)+sizeof(WRAP_OpenProperty_METHOD *)))
  454.     {
  455.         /*
  456.          *  Jump table not derived from IUnknown
  457.          */
  458.         hResult = ResultFromScode(E_INVALIDARG);
  459.         return hResult;
  460.     }
  461.     /*
  462.      *  Check to see if the method is the same
  463.      */
  464.     if (WRAP_OpenProperty != lpWRAP->lpVtbl->OpenProperty)
  465.     {
  466.         /*
  467.          *  Wrong object - the object passed doesn't have this
  468.          *  method.
  469.          */
  470.         hResult = ResultFromScode(E_INVALIDARG);
  471.         return hResult;
  472.     }
  473.     
  474.     if ( ulInterfaceOptions & ~MAPI_UNICODE )
  475.     {
  476.         hResult = ResultFromScode( MAPI_E_UNKNOWN_FLAGS );
  477.         return hResult;
  478.     }
  479.     
  480.     if ( ulInterfaceOptions & MAPI_UNICODE )
  481.     {
  482.         hResult = ResultFromScode( MAPI_E_BAD_CHARWIDTH );
  483.         return hResult;
  484.     }
  485.     
  486.     hResult = lpWRAP->lpPropData->lpVtbl->OpenProperty(
  487.         lpWRAP->lpPropData,
  488.         ulPropTag,
  489.         lpiid,
  490.         ulInterfaceOptions,
  491.         ulFlags,
  492.         lppUnk);
  493.     return hResult;
  494. }
  495. STDMETHODIMP
  496. WRAP_SetProps(  LPWRAP lpWRAP,
  497.                 ULONG cValues,
  498.                 LPSPropValue lpPropArray,
  499.                 LPSPropProblemArray * lppProblems)
  500. {
  501.     HRESULT hResult;
  502.     /*
  503.      *  Check to see if it has a lpVtbl object member
  504.      */
  505.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  506.     {
  507.         /*
  508.          *  No jump table found
  509.          */
  510.         hResult = ResultFromScode(E_INVALIDARG);
  511.         return hResult;
  512.     }
  513.     /*
  514.      *  Check to see that the Vtbl is large enough to include this method
  515.      */
  516.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  517.                      offsetof(WRAP_Vtbl, SetProps)+sizeof(WRAP_SetProps_METHOD *)))
  518.     {
  519.         /*
  520.          *  Jump table not derived from IUnknown
  521.          */
  522.         hResult = ResultFromScode(E_INVALIDARG);
  523.         return hResult;
  524.     }
  525.     /*
  526.      *  Check to see if the method is the same
  527.      */
  528.     if (WRAP_SetProps != lpWRAP->lpVtbl->SetProps)
  529.     {
  530.         /*
  531.          *  Wrong object - the object passed doesn't have this
  532.          *  method.
  533.          */
  534.         hResult = ResultFromScode(E_INVALIDARG);
  535.         return hResult;
  536.     }
  537.     return lpWRAP->lpPropData->lpVtbl->SetProps(
  538.         lpWRAP->lpPropData,
  539.         cValues,
  540.         lpPropArray,
  541.         lppProblems);
  542. }
  543. STDMETHODIMP
  544. WRAP_DeleteProps(   LPWRAP lpWRAP,
  545.                     LPSPropTagArray lpPropTagArray,
  546.                     LPSPropProblemArray * lppProblems)
  547. {
  548.     HRESULT hResult;
  549.     /*
  550.      *  Check to see if it has a lpVtbl object member
  551.      */
  552.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  553.     {
  554.         /*
  555.          *  No jump table found
  556.          */
  557.         hResult = ResultFromScode(E_INVALIDARG);
  558.         return hResult;
  559.     }
  560.     /*
  561.      *  Check to see that the Vtbl is large enough to include this method
  562.      */
  563.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  564.                      offsetof(WRAP_Vtbl, DeleteProps)+sizeof(WRAP_DeleteProps_METHOD *)))
  565.     {
  566.         /*
  567.          *  Jump table not derived from IUnknown
  568.          */
  569.         hResult = ResultFromScode(E_INVALIDARG);
  570.         return hResult;
  571.     }
  572.     /*
  573.      *  Check to see if the method is the same
  574.      */
  575.     if (WRAP_DeleteProps != lpWRAP->lpVtbl->DeleteProps)
  576.     {
  577.         /*
  578.          *  Wrong object - the object passed doesn't have this
  579.          *  method.
  580.          */
  581.         hResult = ResultFromScode(E_INVALIDARG);
  582.         return hResult;
  583.     }
  584.     return lpWRAP->lpPropData->lpVtbl->DeleteProps(
  585.         lpWRAP->lpPropData,
  586.         lpPropTagArray,
  587.         lppProblems);
  588. }
  589. STDMETHODIMP
  590. WRAP_CopyTo(LPWRAP lpWRAP,
  591.             ULONG ciidExclude,
  592.             LPCIID rgiidExclude,
  593.             LPSPropTagArray lpExcludeProps,
  594.             ULONG ulUIParam,
  595.             LPMAPIPROGRESS lpProgress,
  596.             LPCIID lpInterface,
  597.             LPVOID lpDestObj,
  598.             ULONG ulFlags,
  599.             LPSPropProblemArray FAR * lppProblems)
  600. {
  601.     HRESULT hResult;
  602.     /*
  603.      *  Check to see if it has a lpVtbl object member
  604.      */
  605.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  606.     {
  607.         /*
  608.          *  No jump table found
  609.          */
  610.         hResult = ResultFromScode(E_INVALIDARG);
  611.         return hResult;
  612.     }
  613.     /*
  614.      *  Check to see that the Vtbl is large enough to include this method
  615.      */
  616.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  617.                      offsetof(WRAP_Vtbl, CopyTo)+sizeof(WRAP_CopyTo_METHOD *)))
  618.     {
  619.         /*
  620.          *  Jump table not derived from IUnknown
  621.          */
  622.         hResult = ResultFromScode(E_INVALIDARG);
  623.         return hResult;
  624.     }
  625.     /*
  626.      *  Check to see if the method is the same
  627.      */
  628.     if (WRAP_CopyTo != lpWRAP->lpVtbl->CopyTo)
  629.     {
  630.         /*
  631.          *  Wrong object - the object passed doesn't have this
  632.          *  method.
  633.          */
  634.         hResult = ResultFromScode(E_INVALIDARG);
  635.         return hResult;
  636.     }
  637.     return lpWRAP->lpPropData->lpVtbl->CopyTo(
  638.         lpWRAP->lpPropData,
  639.         ciidExclude,
  640.         rgiidExclude,
  641.         lpExcludeProps,
  642.         ulUIParam,
  643.         lpProgress,
  644.         lpInterface,
  645.         lpDestObj,
  646.         ulFlags,
  647.         lppProblems);
  648. }
  649. STDMETHODIMP
  650. WRAP_CopyProps(LPWRAP lpWRAP,
  651.             LPSPropTagArray lpIncludeProps,
  652.             ULONG ulUIParam,
  653.             LPMAPIPROGRESS lpProgress,
  654.             LPCIID lpInterface,
  655.             LPVOID lpDestObj,
  656.             ULONG ulFlags,
  657.             LPSPropProblemArray FAR * lppProblems)
  658. {
  659.     HRESULT hResult;
  660.     /*
  661.      *  Check to see if it has a lpVtbl object member
  662.      */
  663.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  664.     {
  665.         /*
  666.          *  No jump table found
  667.          */
  668.         hResult = ResultFromScode(E_INVALIDARG);
  669.         return hResult;
  670.     }
  671.     /*
  672.      *  Check to see that the Vtbl is large enough to include this method
  673.      */
  674.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  675.                      offsetof(WRAP_Vtbl, CopyProps)+sizeof(WRAP_CopyProps_METHOD *)))
  676.     {
  677.         /*
  678.          *  Jump table not derived from IUnknown
  679.          */
  680.         hResult = ResultFromScode(E_INVALIDARG);
  681.         return hResult;
  682.     }
  683.     /*
  684.      *  Check to see if the method is the same
  685.      */
  686.     if (WRAP_CopyProps != lpWRAP->lpVtbl->CopyProps)
  687.     {
  688.         /*
  689.          *  Wrong object - the object passed doesn't have this
  690.          *  method.
  691.          */
  692.         hResult = ResultFromScode(E_INVALIDARG);
  693.         return hResult;
  694.     }
  695.     return lpWRAP->lpPropData->lpVtbl->CopyProps(
  696.         lpWRAP->lpPropData,
  697.         lpIncludeProps,
  698.         ulUIParam,
  699.         lpProgress,
  700.         lpInterface,
  701.         lpDestObj,
  702.         ulFlags,
  703.         lppProblems);
  704. }
  705. STDMETHODIMP
  706. WRAP_GetNamesFromIDs(   LPWRAP lpWRAP,
  707.                         LPSPropTagArray * lppPropTags,
  708.                         LPGUID lpPropSetGuid,
  709.                         ULONG ulFlags,
  710.                         ULONG * lpcPropNames,
  711.                         LPMAPINAMEID ** lpppPropNames)
  712. {
  713.     HRESULT hResult;
  714.     /*
  715.      *  Check to see if it has a lpVtbl object member
  716.      */
  717.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  718.     {
  719.         /*
  720.          *  No jump table found
  721.          */
  722.         hResult = ResultFromScode(E_INVALIDARG);
  723.         return hResult;
  724.     }
  725.     /*
  726.      *  Check to see that the Vtbl is large enough to include this method
  727.      */
  728.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  729.                      offsetof(WRAP_Vtbl, GetNamesFromIDs)+sizeof(WRAP_GetNamesFromIDs_METHOD *)))
  730.     {
  731.         /*
  732.          *  Jump table not derived from IUnknown
  733.          */
  734.         hResult = ResultFromScode(E_INVALIDARG);
  735.         return hResult;
  736.     }
  737.     /*
  738.      *  Check to see if the method is the same
  739.      */
  740.     if (WRAP_GetNamesFromIDs != lpWRAP->lpVtbl->GetNamesFromIDs)
  741.     {
  742.         /*
  743.          *  Wrong object - the object passed doesn't have this
  744.          *  method.
  745.          */
  746.         hResult = ResultFromScode(E_INVALIDARG);
  747.         return hResult;
  748.     }
  749.     return lpWRAP->lpPropData->lpVtbl->GetNamesFromIDs(
  750.         lpWRAP->lpPropData,
  751.         lppPropTags,
  752.         lpPropSetGuid,
  753.         ulFlags,
  754.         lpcPropNames,
  755.         lpppPropNames);
  756. }
  757. STDMETHODIMP
  758. WRAP_GetIDsFromNames(   LPWRAP lpWRAP,
  759.                         ULONG cPropNames,
  760.                         LPMAPINAMEID * lppPropNames,
  761.                         ULONG ulFlags,
  762.                         LPSPropTagArray * lppPropTags)
  763. {
  764.     HRESULT hResult;
  765.     /*
  766.      *  Check to see if it has a lpVtbl object member
  767.      */
  768.     if (IsBadReadPtr(lpWRAP, offsetof(WRAP, lpVtbl)+sizeof(WRAP_Vtbl *)))
  769.     {
  770.         /*
  771.          *  No jump table found
  772.          */
  773.         hResult = ResultFromScode(E_INVALIDARG);
  774.         return hResult;
  775.     }
  776.     /*
  777.      *  Check to see that the Vtbl is large enough to include this method
  778.      */
  779.     if (IsBadReadPtr(lpWRAP->lpVtbl,
  780.                      offsetof(WRAP_Vtbl, GetIDsFromNames)+sizeof(WRAP_GetIDsFromNames_METHOD *)))
  781.     {
  782.         /*
  783.          *  Jump table not derived from IUnknown
  784.          */
  785.         hResult = ResultFromScode(E_INVALIDARG);
  786.         return hResult;
  787.     }
  788.     /*
  789.      *  Check to see if the method is the same
  790.      */
  791.     if (WRAP_GetIDsFromNames != lpWRAP->lpVtbl->GetIDsFromNames)
  792.     {
  793.         /*
  794.          *  Wrong object - the object passed doesn't have this
  795.          *  method.
  796.          */
  797.         hResult = ResultFromScode(E_INVALIDARG);
  798.         return hResult;
  799.     }
  800.     return lpWRAP->lpPropData->lpVtbl->GetIDsFromNames(
  801.         lpWRAP->lpPropData,
  802.         cPropNames,
  803.         lppPropNames,
  804.         ulFlags,
  805.         lppPropTags);
  806. }