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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * OLEOBJ.C
  3.  *
  4.  * Contains all callback functions in the OLEOBJECTVTBL struture:
  5.  *      ObjDoVerb
  6.  *      ObjEnumFormats
  7.  *      ObjGetData
  8.  *      ObjQueryProtocol
  9.  *      ObjRelease
  10.  *      ObjSetBounds
  11.  *      ObjSetColorScheme
  12.  *      ObjSetData
  13.  *      ObjSetTargetDevice
  14.  *      ObjShow
  15.  *
  16.  * There are additional callbacks in the OLEOBJECTVTBL.
  17.  * Also contains PObjectAllocate, a constructor for the object.
  18.  *
  19.  * Copyright(c) Microsoft Corp. 1992-1994 All Rights Reserved
  20.  * Win32 version, January 1994
  21.  */
  22. #ifdef MAKEOLESERVER
  23. #include <windows.h>
  24. #include <ole.h>
  25. #include "cosmo.h"
  26. #include "oleglobl.h"
  27. #include "oleinst.h"    //OBJVERB_* defines for ObjDoVerb
  28. /*
  29.  * PObjectAllocate
  30.  *
  31.  * Purpose:
  32.  *  Allocates a COSMOOBJECT structure and sets the defaults in its fields.
  33.  *  Used from DocGetObject.
  34.  *
  35.  * Parameters:
  36.  *  pVtblObj        LPOLESERVERDOCVTBL used to initialize the pvtbl field.
  37.  *
  38.  * Return Value:
  39.  *  LPCOSMOOBJECT   Pointer to the allocated structure in local memory.
  40.  *                  The hMem field will contain a handle to the structure
  41.  *                  to pass to LocalFree.
  42.  */
  43. LPCOSMOOBJECT WINAPI PObjectAllocate(LPOLEOBJECTVTBL pVtblObj)
  44.     {
  45.     HLOCAL          hMem;
  46.     LPCOSMOOBJECT   pObj;
  47.     hMem=LocalAlloc(LPTR, sizeof(COSMOOBJECT));
  48.     pObj=(LPCOSMOOBJECT)(PSTR)hMem;
  49.     //Initialize the object.
  50.     pObj->hMem=hMem;
  51.     pObj->pvtbl=pVtblObj;
  52.     pObj->fRelease=TRUE;
  53.     return pObj;
  54.     }
  55. /*
  56.  * ObjDoVerb
  57.  *
  58.  * Purpose:
  59.  *  Performs actions on an object when the user opens an object
  60.  *  according to the verb given.
  61.  *
  62.  * Parameters:
  63.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  64.  *  iVerb           UINT index to the verb chosen, zero based.
  65.  *  fShow           BOOL--TRUE if the application should show
  66.  *                  itself with ShowWindow.  FALSE means no change.
  67.  *  fFocus          BOOL--TRUE if the server should get the focus.
  68.  *
  69.  * Return Value:
  70.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  71.  */
  72. OLESTATUS WINAPI ObjDoVerb(LPCOSMOOBJECT pObj, UINT iVerb
  73.     , BOOL fShow, BOOL fFocus)
  74.     {
  75.     /*
  76.      * 1.   Execute the verb.
  77.      *        a.  For a 'Play' verb, a server does not generally show
  78.      *            its window or affect the focus.
  79.      *
  80.      *        b.  For an 'Edit' verb, show the server's window and the
  81.      *            object if fShow is TRUE, and take the focus if fFocus
  82.      *            is TRUE.  An ideal way to accomplish this is to call
  83.      *            the ObjShow method through the OLEOBJECTVTBL since that
  84.      *            method will handle showing the object and taking the
  85.      *            focus itself.
  86.      *
  87.      *        c.  An 'Open' verb is not clearly defined; depending on the
  88.      *            application it may mean the same as 'Play' or 'Edit.'
  89.      *            The Cosmo server, if it had an 'Open' verb, would treat
  90.      *            it like 'Edit.'
  91.      *
  92.      * 2.  Return OLE_OK if the verb was successfully executed, otherwise
  93.      *     OLE_ERROR_DOVERB.
  94.      */
  95.     switch (iVerb)
  96.         {
  97.         case OBJVERB_EDIT:
  98.             /*
  99.              * On edit, simply show yourself and expect a SetData.
  100.              * Best strategy is to use the Show method for this
  101.              * object if necessary, reducing redundancy.
  102.              */
  103.             if (fShow)
  104.                 return (pObj->pvtbl->Show)((LPOLEOBJECT)pObj, fShow);
  105.             //Return OLE_OK
  106.             break;
  107.         case OBJVERB_PLAY:
  108.             //Unsupported at this time.
  109.             return OLE_ERROR_DOVERB;
  110.         default:
  111.             return OLE_ERROR_DOVERB;
  112.         }
  113.     return OLE_OK;
  114.     }
  115. /*
  116.  * ObjEnumFormats
  117.  *
  118.  * Purpose:
  119.  *  Requests the server to produce the 'next' supported clipboard
  120.  *  format.  Each format is returned in sequence until the terminator
  121.  *  (a NULL) is returned.
  122.  *
  123.  * Parameters:
  124.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  125.  *  cf              OLECLIPFORMAT the last clipboard format returned by
  126.  *                  this function.  0 indicates the first.
  127.  *
  128.  * Return Value:
  129.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  130.  */
  131. OLECLIPFORMAT WINAPI ObjEnumFormats(LPCOSMOOBJECT pObj, OLECLIPFORMAT cf)
  132.     {
  133.     /*
  134.      * 1.   Depending on cf, return the 'next' clipboard format in which
  135.      *      the server can render the object's data.
  136.      * 2.   If there are no more supported formats after the format in cf,
  137.      *      return NULL.
  138.      *
  139.      * We must use multiple if's instead of a switch statement because
  140.      * all the cf* values are not constants.
  141.      */
  142.     if (0==cf)
  143.        return pOLE->cfNative;
  144.     if (pOLE->cfNative==cf)
  145.        return pOLE->cfOwnerLink;
  146.     if (pOLE->cfOwnerLink==cf)
  147.        return CF_METAFILEPICT;
  148.     if (CF_METAFILEPICT==cf)
  149.        return CF_BITMAP;
  150.     if (CF_BITMAP==cf)
  151.        return pOLE->cfObjectLink;
  152.     //This IF is here just to be explicit.
  153.     if (pOLE->cfObjectLink==cf)
  154.        return 0;
  155.     return 0;
  156.     }
  157. /*
  158.  * ObjGetData
  159.  *
  160.  * Purpose:
  161.  *  Retrieves data from the object in a specified format, where the
  162.  *  server should allocate memory (GlobalAlloc with GMEM_DDESHARE),
  163.  *  fill the memory, and return the handle.
  164.  *
  165.  * Parameters:
  166.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  167.  *  cf              OLECLIPFORMAT format to return data in, may be "Native."
  168.  *  phData          HGLOBAL FAR * in which to store the allocated handle.
  169.  *
  170.  * Return Value:
  171.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  172.  */
  173. OLESTATUS WINAPI ObjGetData(LPCOSMOOBJECT pObj, OLECLIPFORMAT cf
  174.     , HGLOBAL FAR * phData)
  175.     {
  176.     HGLOBAL             hMem;
  177.     /*
  178.      * 1.   Allocate the requested data throguh GlobalAlloc (with
  179.      *      GMEM_MOVEABLE and GMEM_DDESHARE).  The exception is data for
  180.      *      CF_BITMAP which uses a call like CreateBitmap.
  181.      * 2.   Lock and fill the memory with the appropriate data.
  182.      * 3.   Unlock the memory and store the handle in *phData.
  183.      * 4.   Return OLE_OK if successful, OLE_ERROR_MEMORY otherwise.
  184.      */
  185.     //Return Native, metafile, or bitmap as requested.
  186.     if (pOLE->cfNative==cf)
  187.         hMem=HGetPolyline(pGlob->hWndPolyline);
  188.     if (CF_METAFILEPICT==cf)
  189.         hMem=HGetMetafilePict(pGlob->hWndPolyline);
  190.     if (CF_BITMAP==cf)
  191.         hMem=HGetBitmap(pGlob->hWndPolyline);
  192.     //Use filename
  193.     if (pOLE->cfObjectLink==cf)
  194.          hMem=HLinkConstruct(rgpsz[IDS_CLASSCOSMO], "", "");
  195.     /*
  196.      * Even though this is exactly like ObjectLink, this is coded as
  197.      * a separate case just in case it changes in the future.
  198.      */
  199.     if (pOLE->cfOwnerLink==cf)
  200.         hMem=HLinkConstruct(rgpsz[IDS_CLASSCOSMO], "", "");
  201.     if (NULL==hMem)
  202.         return OLE_ERROR_MEMORY;
  203.     *phData=hMem;
  204.     return OLE_OK;
  205.     }
  206. /*
  207.  * ObjQueryProtocol
  208.  *
  209.  * Purpose:
  210.  *  Returns a pointer to an COSMOOBJECT with the appropriate VTBL for
  211.  *  the protocol, either StdFileEditing or StdExecute.  Returns NULL
  212.  *  if that protocol is not supported.
  213.  *
  214.  * Parameters:
  215.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  216.  *  pszProtocol     OLE_LPCSTR, the protocol name.
  217.  *
  218.  * Return Value:
  219.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  220.  */
  221. LPVOID WINAPI ObjQueryProtocol(LPCOSMOOBJECT pObj, OLE_LPCSTR pszProtocol)
  222.     {
  223.     /*
  224.      * 1.   If the protocol in pszProtocol is supported, return a pointer
  225.      *      to an object that contains an appropriate VTBL fot that protocol,
  226.      *      such as the pObj passed to this method.
  227.      * 2.   If the protocol is not supported, return NULL.
  228.      */
  229.     //Check if OLESVR is asking for "StdFileEditing"
  230.     if (0==lstrcmp(pszProtocol, rgpsz[IDS_STDFILEEDITING]))
  231.         return (LPVOID)pObj;
  232.     return (LPVOID)NULL;
  233.     }
  234. /*
  235.  * ObjRelease
  236.  *
  237.  * Purpose:
  238.  *  Notifies a server that is can free any resources associated with an
  239.  *  object.
  240.  *
  241.  * Parameters:
  242.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  243.  *
  244.  * Return Value:
  245.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  246.  */
  247. OLESTATUS WINAPI ObjRelease(LPCOSMOOBJECT pObj)
  248.     {
  249.     /*
  250.      * 1.   Free any resources allocated for this object, but
  251.      *      DO NOT free the OLEOBJECT structure itself.
  252.      * 2.   Set a flag to indicate that Release has been called.
  253.      * 3.   NULL any saved LPOLECLIENT stores in the OLEOBJECT structure.
  254.      * 4.   Return OLE_OK if successful, OLE_ERROR_GENERIC otherwise.
  255.      *
  256.      * Do not use the Release method to free the memory containing
  257.      * the object since you still need to use its pClient and fRelease.
  258.      * This method simply notifies the object that no one is using it
  259.      * anymore so we don't try to send notifications.
  260.      */
  261.     pObj->fRelease=TRUE;
  262.     pObj->pClient=NULL;
  263.     return OLE_OK;
  264.     }
  265. /*
  266.  * ObjSetBounds
  267.  *
  268.  * Purpose:
  269.  *  Specifies a new boundary rectangle for the object in MM_HIMETRIC
  270.  *  units.  Only useful for embedded objects since a linked object
  271.  *  depends on the file loaded.
  272.  *
  273.  * Parameters:
  274.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  275.  *  pRect           LPRECT containing the new bounds.
  276.  *
  277.  * Return Value:
  278.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  279.  */
  280. OLESTATUS WINAPI ObjSetBounds(LPCOSMOOBJECT pObj, OLE_CONST RECT FAR *pRect)
  281.     {
  282.     //Unused in OLE1.x
  283.     return OLE_OK;
  284.     }
  285. /*
  286.  * ObjSetColorScheme
  287.  *
  288.  * Purpose:
  289.  *  Provides a color scheme that the client application recommends for
  290.  *  rendering graphical data.
  291.  *
  292.  * Parameters:
  293.  *  pDoc            LPCOSMOOBJECT specifying the object affected.
  294.  *  pPal            LPLOGPALETTE describing the recommended palette.
  295.  *
  296.  * Return Value:
  297.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  298.  */
  299. OLESTATUS WINAPI ObjSetColorScheme(LPCOSMOOBJECT pObj
  300.     , OLE_CONST LOGPALETTE FAR *pPal)
  301.     {
  302.     /*
  303.      * Servers are not required to use this palette.  The LPLOGPALETTE
  304.      * only is a convenient structure to contain the color scheme; IT DOES
  305.      * not REPRESENT A PALETTE IN STRICT TERMS!  Do NOT call CreatePalette
  306.      * and try to realize it.
  307.      *
  308.      * The color scheme contained in the LOGPALETTE structure contains
  309.      * a number of colors where the first color is the suggested foreground,
  310.      * the second the suggested background, then the first HALF of those
  311.      * remaining are suggested fill colors and the last half suggested
  312.      * line colors.  If there are an odd number of colors, give the extra
  313.      * color to the fill colors, that is, there is one less line color than
  314.      * fill colors.
  315.      */
  316.     return OLE_ERROR_PALETTE;
  317.     }
  318. /*
  319.  * ObjSetData
  320.  *
  321.  * Purpose:
  322.  *  Instructs the object to take the given data as current and copy it
  323.  *  to the object's internal data, use when a client opens an embedded
  324.  *  object or if the client calls OleSetData.
  325.  *
  326.  *  *NOTE: This function MUST be supported even if the registration
  327.  *         database does not contain an entry for SetDataFormats for
  328.  *         this server, because the callback is still used when opening
  329.  *         an embedded object for editing.
  330.  *
  331.  * Parameters:
  332.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  333.  *  cf              OLECLIPFORMAT format to return data in, may be "Native."
  334.  *  hData           HGLOBAL to memory containing the data.
  335.  *
  336.  * Return Value:
  337.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  338.  */
  339. OLESTATUS WINAPI ObjSetData(LPCOSMOOBJECT pObj, OLECLIPFORMAT cf
  340.     , HGLOBAL hData)
  341.     {
  342.     LPPOLYLINE          lppl;
  343.     /*
  344.      * 1.   If the data format is not supported, return OLE_ERROR_FORMAT.
  345.      * 2.   Attempt to GlobalLock the memory to get a pointer to the data.
  346.      *      If GlobalLock returns NULL, return OLE_ERROR_MEMORY.
  347.      * 3.   Copy the data to the object identified by pObj.
  348.      * 4.   Unlock and GlobalFree the data handle.  The ObjSetData method
  349.      *      is responsible for the memory.
  350.      * 5.   Return OLE_OK.
  351.      */
  352.     //Check if we were given Native data.  We don't support anything else.
  353.     if (pOLE->cfNative!=cf)
  354.         return OLE_ERROR_FORMAT;
  355.     lppl=(LPPOLYLINE)GlobalLock(hData);
  356.     /*
  357.      * CHECK the return from GlobalLock since we don't know where this
  358.      * handle has been.
  359.      */
  360.     if (NULL==lppl)
  361.         return OLE_ERROR_MEMORY;
  362.     //Set the data through the editing window.
  363.     SendMessage(pGlob->hWndPolyline, PLM_POLYLINESET, TRUE, (LONG)lppl);
  364.     //Make sure we are not dirty--no updating is yet necessary.
  365.     FDirtySet(FALSE);
  366.     //Server is responsible for freeing the data.
  367.     GlobalUnlock(hData);
  368.     GlobalFree(hData);
  369.     return OLE_OK;
  370.     }
  371. /*
  372.  * ObjSetTargetDevice
  373.  *
  374.  * Purpose:
  375.  *  Communicates information from the client application to the server
  376.  *  about the device on which the object is drawn.
  377.  *
  378.  * Parameters:
  379.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  380.  *  hData           HGLOBAL containing a STDTARGETDEVICE structure.
  381.  *
  382.  * Return Value:
  383.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  384.  */
  385. OLESTATUS WINAPI ObjSetTargetDevice(LPCOSMOOBJECT pObj, HGLOBAL hData)
  386.     {
  387.     /*
  388.      * The server is responsible for freeing the the data handle
  389.      * once it has finished using that data.
  390.      *
  391.      * If NULL==hData, then rendering is necessary for the screen.
  392.      */
  393.     if (NULL!=hData)
  394.         GlobalFree(hData);
  395.     return OLE_OK;
  396.     }
  397. /*
  398.  * ObjShow
  399.  *
  400.  * Purpose:
  401.  *  Causes the server to show an object, showing the window and
  402.  *  scrolling it's client area if necessary.
  403.  *
  404.  * Parameters:
  405.  *  pObj            LPCOSMOOBJECT specifying the object affected.
  406.  *  fTakeFocus      BOOL:  TRUE if the server should get the focus,
  407.  *                  FALSE if not.
  408.  *
  409.  * Return Value:
  410.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  411.  */
  412. OLESTATUS WINAPI ObjShow(LPCOSMOOBJECT pObj, BOOL fTakeFocus)
  413.     {
  414.     /*
  415.      * 1.   Show the application window(s) if not already visible.
  416.      * 2.   Scroll the object identified by pObj into view, if necessary.
  417.      * 3.   Select the object if possible.
  418.      * 4.   If fTakeFocus is TRUE, call SetFocus with the main window handle.
  419.      * 5.   Return OLE_OK if successful, OLE_ERROR_GENERIC otherwise.
  420.      */
  421.     //Keep WM_SIZE on the ShowWindow from making us dirty.
  422.     pGlob->fNoDirty=TRUE;
  423.     //Since we only have one object, we don't care what's in pObj.
  424.     ShowWindow(pGlob->hWnd, SW_NORMAL);
  425.     pGlob->fNoDirty=FALSE;
  426.     if (fTakeFocus)
  427.         SetFocus(pGlob->hWnd);
  428.     return OLE_OK;
  429.     }
  430. #endif //MAKEOLESERVER