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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * OLESVR.C
  3.  *
  4.  * Contains all callback functions in the OLESERVERVTBL struture:
  5.  *      ServerCreate
  6.  *      ServerCreateFromTemplate
  7.  *      ServerEdit
  8.  *      ServerExecute
  9.  *      ServerExit
  10.  *      ServerOpen
  11.  *      ServerRelease
  12.  *
  13.  * Also includes the constructor function PServerAllocate.
  14.  *
  15.  * Copyright(c) Microsoft Corp. 1992-1994 All Rights Reserved
  16.  * Win32 version, January 1994
  17.  */
  18. #ifdef MAKEOLESERVER
  19. #include <windows.h>
  20. #include <ole.h>
  21. #include "cosmo.h"
  22. #include "oleglobl.h"
  23. /*
  24.  * PServerAllocate
  25.  *
  26.  * Purpose:
  27.  *  Allocates a COSMOSERVER structure and sets the defaults in its fields.
  28.  *  Used from application initialization.
  29.  *
  30.  * Parameters:
  31.  *  pVtblSvr        LPOLESERVERVTBL used to initialize the pvtbl field.
  32.  *
  33.  * Return Value:
  34.  *  LPCOSMOSERVER   Pointer to the allocated structure in local memory.
  35.  *                  The hMem field will contain a handle to the structure
  36.  *                  to pass to LocalFree.
  37.  *
  38.  */
  39. LPCOSMOSERVER WINAPI PServerAllocate(LPOLESERVERVTBL pVtblSvr)
  40.     {
  41.     HLOCAL            hMem;
  42.     LPCOSMOSERVER     pSvr;
  43.     hMem=LocalAlloc(LPTR, CBCOSMOSERVER);
  44.     if (NULL==hMem)
  45.         return FALSE;
  46.     pSvr=(LPCOSMOSERVER)(PSTR)hMem;
  47.     //All fields are initially NULL from LMEM_ZEROINIT.
  48.     pSvr->hMem=hMem;
  49.     pSvr->pvtbl=pVtblSvr;
  50.     pSvr->fRelease=TRUE;            //Indicate a released state.
  51.     return pSvr;
  52.     }
  53. /*
  54.  * ServerCreate
  55.  *
  56.  * Purpose:
  57.  *  Creates a new object of the class in pszClass which will be
  58.  *  embedded in a client application document whose name is in
  59.  *  pszDoc.
  60.  *
  61.  * Parameters:
  62.  *  pSvr            LPCOSMOSERVER to structure identifying the server.
  63.  *  lhDoc           LHSERVERDOC identifying the document.
  64.  *  pszClass        OLE_LPCSTR specifying the class of document to create.
  65.  *  pszDoc          OLE_LPCSTR specifying the document for use in window titles.
  66.  *  ppServerDoc     LPLPOLESERVERDOC in which to store a pointer
  67.  *                  to the OLESERVERDOC structure for this new document.
  68.  *
  69.  * Return Value:
  70.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  71.  */
  72. OLESTATUS WINAPI ServerCreate(LPCOSMOSERVER pSvr, LHSERVERDOC lhDoc
  73.     , OLE_LPCSTR pszClass, OLE_LPCSTR pszDoc, LPLPOLESERVERDOC ppServerDoc)
  74.     {
  75.     LPCOSMODOC      pDoc;
  76.     /*
  77.      * 1.   Create a document of the specified class.
  78.      * 2.   Allocate and initialize an OLESERVERDOC structure.
  79.      * 3.   Store lhDoc in the OLESERVERDOC structure.
  80.      * 4.   Store a pointer to the new OLESERVERDOC structure in ppServerDoc.
  81.      * 5.   Return OLE_OK if successful, OLE_ERROR_NEW otherwise.
  82.      */
  83.     /*
  84.      * If this were an MDI application, then we would want to create
  85.      * a new window and a new document, including a new OLESERVERDOC
  86.      * structure.  The protocol supports this, however, this application
  87.      * is single-document.
  88.      */
  89.     pDoc=PDocumentAllocate(&pOLE->vtblDoc);
  90.     if ((LPCOSMODOC)NULL==pDoc)
  91.         return OLE_ERROR_NEW;
  92.     pSvr->pDoc=pDoc;
  93.     pDoc->lh=lhDoc;
  94.     *ppServerDoc=(LPOLESERVERDOC)pDoc;
  95.     return OLE_OK;
  96.     }
  97. /*
  98.  * ServerCreateFromTemplate
  99.  *
  100.  * Purpose:
  101.  *  Creates a new document initialized with the data in a specified
  102.  *  file.  Thw new document is opened for editing and is embedded
  103.  *  within the client when the server is updated or closed.
  104.  *
  105.  * Parameters:
  106.  *  pSvr            LPCOSMOSERVER to structure identifying the server.
  107.  *  lhDoc           LHSERVERDOC identifying the document.
  108.  *  pszClass        OLE_LPCSTR specifying the class of document to create.
  109.  *  pszDoc          OLE_LPCSTR to the permanent name of the document to open.
  110.  *  pszTemp         OLE_LPCSTR to the file to use as a template.
  111.  *  ppServerDoc     LPLPOLESERVERDOC in which to store a pointer
  112.  *                  to the OLESERVERDOC structure for this new document.
  113.  *
  114.  * Return Value:
  115.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  116.  */
  117. OLESTATUS WINAPI ServerCreateFromTemplate(LPCOSMOSERVER pSvr
  118.     , LHSERVERDOC lhDoc, OLE_LPCSTR pszClass, OLE_LPCSTR pszDoc
  119.     , OLE_LPCSTR pszTemp, LPLPOLESERVERDOC ppServerDoc)
  120.     {
  121.     POLYLINE        pl;
  122.     LPCOSMODOC      pDoc;
  123.     /*
  124.      * 1.   Create a document of the specified class.
  125.      * 2.   Read the contents of the specified file and initialize the document.
  126.      * 3.   Allocate and initialize an OLESERVERDOC structure.
  127.      * 4.   Store lhDoc in the OLESERVERDOC structure.
  128.      * 5.   Store a pointer to the new OLESERVERDOC structure in ppServerDoc.
  129.      * 6.   Return OLE_OK if successful, OLE_ERROR_TEMPLATE otherwise.
  130.      */
  131.     //pszTemp contains a filename.
  132.     if (!FCosFileRead(pGlob, (LPSTR)pszTemp, &pl))
  133.         return OLE_ERROR_TEMPLATE;
  134.     pDoc=PDocumentAllocate(&pOLE->vtblDoc);
  135.     if ((LPCOSMODOC)NULL==pDoc)
  136.         return OLE_ERROR_TEMPLATE;
  137.     pSvr->pDoc=pDoc;
  138.     pDoc->lh=lhDoc;
  139.     *ppServerDoc=(LPOLESERVERDOC)pDoc;
  140.     SendMessage(pGlob->hWndPolyline, PLM_POLYLINESET, TRUE, (LONG)(LPSTR)&pl);
  141.     //The titles in this window will be set later through SetHostNames.
  142.     pGlob->fOpenFile=TRUE;
  143.     return OLE_OK;
  144.     }
  145. /*
  146.  * ServerEdit
  147.  *
  148.  * Purpose:
  149.  *  Creates a document initialized with data from a subsequent call
  150.  *  to the SetData function.  The object is embedded in the client
  151.  *  application and the server is not visible.
  152.  *
  153.  * Parameters:
  154.  *  pSvr            LPCOSMOSERVER to structure identifying the server.
  155.  *  lhDoc           LHSERVERDOC identifying the document.
  156.  *  pszClass        OLE_LPCSTR specifying the class of document to create.
  157.  *  pszDoc          OLE_LPCSTR specifying the document for use in window titles.
  158.  *  ppServerDoc     LPLPOLESERVERDOC in which to store a pointer
  159.  *                  to the OLESERVERDOC structure for this new document.
  160.  *
  161.  * Return Value:
  162.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  163.  */
  164. OLESTATUS WINAPI ServerEdit(LPCOSMOSERVER pSvr, LHSERVERDOC lhDoc
  165.     , OLE_LPCSTR pszClass, OLE_LPCSTR pszDoc, LPLPOLESERVERDOC ppServerDoc)
  166.     {
  167.     LPCOSMODOC      pDoc;
  168.     /*
  169.      * This is the same as Open, but tells the server to expect
  170.      * a SetData call and that the server is initially hidden.
  171.      *
  172.      * 1.   Create a document of the specified class.
  173.      * 2.   Allocate and initialize an OLESERVERDOC structure.
  174.      * 3.   Store lhDoc in the OLESERVERDOC structure.
  175.      * 4.   Store pointer to the new OLESERVERDOC structure in ppServerDoc.
  176.      * 5.   Return OLE_OK if successful, OLE_ERROR_EDIT otherwise.
  177.      */
  178.     pDoc=PDocumentAllocate(&pOLE->vtblDoc);
  179.     if ((LPCOSMODOC)NULL==pDoc)
  180.         return OLE_ERROR_EDIT;
  181.     pSvr->pDoc=pDoc;
  182.     pDoc->lh=lhDoc;
  183.     *ppServerDoc=(LPOLESERVERDOC)pDoc;
  184.     return OLE_OK;
  185.     }
  186. /*
  187.  * ServerExecute
  188.  *
  189.  * Purpose:
  190.  *  Handles DDE Execute commands sent from the server library
  191.  *  from the client application.  Not all applications need to support
  192.  *  DDE Execute.
  193.  *
  194.  * Parameters:
  195.  *  pSvr            LPCOSMOSERVER identifying the server closing.
  196.  *  hCommands       HGLOBAL to memory containing the DDE execute
  197.  *                  string.
  198.  *
  199.  * Return Value:
  200.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  201.  *                  This functions returns OLE_ERROR_COMMAND to indicate
  202.  *                  that it is not implemented.
  203.  */
  204. OLESTATUS WINAPI ServerExecute(LPCOSMOSERVER pSvr, HGLOBAL hCommands)
  205.     {
  206.     /*
  207.      * 1.   Lock the hCommands handle to access the execute strings.
  208.      * 2.   Parse and execute the commands as necessary.
  209.      * 3.   DO NOT FREE hCommands.
  210.      * 4.   Return OLE_OK if successful, OLE_ERROR_COMMAND otherwise.
  211.      */
  212.     return OLE_ERROR_COMMAND;
  213.     }
  214. /*
  215.  * ServerExit
  216.  *
  217.  * Purpose:
  218.  *  Instructs the server application to close documents and shut down.
  219.  *
  220.  * Parameters:
  221.  *  pSvr            LPCOSMOSERVER identifying the server closing.
  222.  *
  223.  * Return Value:
  224.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  225.  */
  226. OLESTATUS WINAPI ServerExit(LPCOSMOSERVER pSvr)
  227.     {
  228.     /*
  229.      * 1.   Hide the window to prevent any user interaction.
  230.      * 2.   Call OleRevokeServer.  Ignore an OLE_WAIT_FOR_RELEASE return value.
  231.      * 3.   Perform whatever action is necessary to cause the application
  232.      *      to terminate, such as DestroyWindow.
  233.      * 4.   Return OLE_OK if successful, OLE_ERROR_GENERIC otherwise.
  234.      */
  235.     ShowWindow(pGlob->hWnd, SW_HIDE);
  236.     pSvr->fRelease=FALSE;
  237.     OleRevokeServer(pSvr->lh);
  238.     DestroyWindow(pGlob->hWnd);
  239.     return OLE_OK;
  240.     }
  241. /*
  242.  * ServerOpen
  243.  *
  244.  * Purpose:
  245.  *  Opens an exiting file (document) and prepares the document for
  246.  *  editing, generally done when a user double-clicks a linked
  247.  *  object in the client.  Note that the server is hidden at this
  248.  *  point.
  249.  *
  250.  * Parameters:
  251.  *  pSvr            LPCOSMOSERVER to structure identifying the server.
  252.  *  lhDoc           LHSERVERDOC identifying the document.
  253.  *  pszDoc          OLE_LPCSTR to the permanent name of the document to
  254.  *                  be opened.
  255.  *  ppServerDoc     LPLPOLESERVERDOC in which to store a pointer
  256.  *                  to the OLESERVERDOC structure for this new document.
  257.  *
  258.  * Return Value:
  259.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  260.  */
  261. OLESTATUS WINAPI ServerOpen(LPCOSMOSERVER pSvr, LHSERVERDOC lhDoc
  262.     , OLE_LPCSTR pszDoc, LPLPOLESERVERDOC ppServerDoc)
  263.     {
  264.     POLYLINE        pl;
  265.     LPCOSMODOC      pDoc;
  266.     /*
  267.      * 1.   Create a document of the specified class.
  268.      * 2.   Read the contents of the specified file and initialize the document.
  269.      * 3.   Save the filename of the loaded file with this document,
  270.      *      if necessary.
  271.      * 4.   Allocate and initialize an OLESERVERDOC structure.
  272.      * 5.   Store lhDoc in the OLESERVERDOC structure.
  273.      * 6.   Store a pointer to the new OLESERVERDOC structure in ppServerDoc.
  274.      * 7.   Return OLE_OK if successful, OLE_ERROR_OPEN otherwise.
  275.      */
  276.     if (!FCosFileRead(pGlob, (LPSTR)pszDoc, &pl))
  277.         return OLE_ERROR_OPEN;
  278.     pDoc=PDocumentAllocate(&pOLE->vtblDoc);
  279.     if ((LPCOSMODOC)NULL==pDoc)
  280.         return OLE_ERROR_OPEN;
  281.     //Save the document in the server for later access in ServerRelease.
  282.     pSvr->pDoc=pDoc;
  283.     pDoc->lh=lhDoc;
  284.     *ppServerDoc=(LPOLESERVERDOC)pDoc;
  285.     WindowTitleSet(pGlob->hWnd, (LPSTR)pszDoc);
  286.     SendMessage(pGlob->hWndPolyline, PLM_POLYLINESET, TRUE, (LONG)(LPSTR)&pl);
  287.     pGlob->fOpenFile=TRUE;
  288.     return OLE_OK;
  289.     }
  290. /*
  291.  * ServerRelease
  292.  *
  293.  * Purpose:
  294.  *  Notifies a server that all connections to it have been closed and
  295.  *  that the server application can terminate.  This function should
  296.  *  change the state of a global flag that causes any PeekMessage
  297.  *  waiting loop to exit.
  298.  *
  299.  * Parameters:
  300.  *  pSvr            LPCOSMOSERVER identifying the server.
  301.  *
  302.  * Return Value:
  303.  *  OLESTATUS       OLE_OK if all is well, otherwise an OLE_* error value.
  304.  */
  305. OLESTATUS WINAPI ServerRelease(LPCOSMOSERVER pSvr)
  306.     {
  307.     /*
  308.      * 1.   Set a flag to indicate that Release has been called.
  309.      * 2.   If the application is hidden, we must use ServerRelease to
  310.      *      instruct the application to terminate, by posting a WM_CLOSE
  311.      *      or otherwise effective message, then exit the method with OLE_OK.
  312.      * 3.   Free any resources allocated for this server, like documents,
  313.      *      but DO NOT free the OLESERVER structure itself.
  314.      * 4.   Return OLE_OK if successful, OLE_ERROR_GENERIC otherwise.
  315.      */
  316.     pSvr->fRelease=TRUE;
  317.     /*
  318.      * If we are invisible when we get ServerRelease, that's a flag
  319.      * to us meaning exit.  Posting a WM_CLOSE takes care of all
  320.      * this.  Note that even though WM_CLOSE processing in COSMO.C
  321.      * checks for a dirty file and asks to save if necessary, the
  322.      * file cannot be dirty because there has been no chance for
  323.      * the user to make any changes.
  324.      *
  325.      * ServerRelease may be called twice when the server is opened invisible
  326.      * for an update of a client object.  In this case, we'll get
  327.      * ServerRelease once, where we should post a message to terminate the
  328.      * application.  The second time around we need to handle free resources
  329.      * associated with the server.  We detect this through the validity
  330.      * pOLE->pSvr->lh which we set to 0L in FFileExit before calling
  331.      * OleRevokeServer.  0L in lh signals us that we're in the final
  332.      * revoke and we can free documents.
  333.      *
  334.      */
  335.     if (!IsWindowVisible(pGlob->hWnd) && 0L!=pOLE->pSvr->lh)
  336.         {
  337.         PostMessage(pGlob->hWnd, WM_CLOSE, 0, 0L);
  338.         return OLE_OK;
  339.         }
  340.     /*
  341.      * Free the document if we are closing from OleRevokeServer, not through
  342.      * a client releasing the server.
  343.      */
  344.     if (0L==pOLE->pSvr->lh)
  345.         {
  346.         //Free the document we're holding.
  347.         if (NULL!=pSvr->pDoc)
  348.             {
  349.             if (NULL!=pSvr->pDoc->hMem)
  350.                 LocalFree(pSvr->pDoc->hMem);
  351.             }
  352.         pSvr->pDoc=NULL;
  353.         }
  354.     return OLE_OK;
  355.     }
  356. #endif //MAKEOLESERVER