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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * OLEMISC.C
  3.  *
  4.  * Functions without another approprate home:
  5.  *  MenuEmbeddingSet
  6.  *  OLEClientNotify
  7.  *  FOLEReleaseWait
  8.  *
  9.  * Copyright(c) Microsoft Corp. 1992-1994 All Rights Reserved
  10.  * Win32 version, January 1994
  11.  */
  12. #ifdef MAKEOLESERVER
  13. #include <windows.h>
  14. #include <ole.h>
  15. #include "cosmo.h"
  16. #include "oleglobl.h"
  17. /*
  18.  * MenuEmbeddingSet
  19.  *
  20.  * Purpose:
  21.  *  Modifies the main menu of the application to change "Save" to "Update"
  22.  *  and to change "Exit" to "Exit & return to xx."  Alternately, this
  23.  *  function can change the menus back to the original state, reverting
  24.  *  "Update" to "Save" and setting the Exit item back to plain "Exit."
  25.  *
  26.  * Parameters:
  27.  *  hWnd            HWND of the window with the menu.
  28.  *  pszClient       LPSTR to the client name.
  29.  *  fOLE            BOOL indiciating if we are to set for OLE or to normal.
  30.  *                  If setting to normal, pszClient can be NULL.
  31.  *
  32.  * Return Value:
  33.  *  None.
  34.  *
  35.  */
  36. void WINAPI MenuEmbeddingSet(HWND hWnd, LPSTR pszClient, BOOL fOLE)
  37.     {
  38.     HMENU       hMenu;
  39.     char        szTemp[130];
  40.     LPSTR       pszT;
  41.     hMenu=GetMenu(pGlob->hWnd);
  42.     //Change the File/Save menu to File/Update <client> or vice-versa
  43.     if (fOLE)
  44.         wsprintf(szTemp, rgpsz[IDS_UPDATE], pszClient);
  45.     else
  46.         lstrcpy(szTemp, rgpsz[IDS_SAVE]);
  47.     ModifyMenu(hMenu, IDM_FILESAVE, MF_STRING, IDM_FILESAVE, szTemp);
  48.     //Change the File/Save As menu to File/Save Copy As or vice-versa.
  49.     pszT=(fOLE) ? rgpsz[IDS_SAVECOPYAS] : rgpsz[IDS_SAVEAS];
  50.     ModifyMenu(hMenu, IDM_FILESAVEAS, MF_STRING, IDM_FILESAVEAS, pszT);
  51.     //Change "Exit" to "Exit & return to xx" or vice-versa.
  52.     if (fOLE)
  53.         wsprintf(szTemp, rgpsz[IDS_EXITANDRETURN], pszClient);
  54.     else
  55.         lstrcpy(szTemp, rgpsz[IDS_EXIT]);
  56.     ModifyMenu(hMenu, IDM_FILEEXIT, MF_STRING, IDM_FILEEXIT, szTemp);
  57.     return;
  58.     }
  59. /*
  60.  * OLEClientNotify
  61.  *
  62.  * Purpose:
  63.  *  Performs a direct function call to the single callback in the
  64.  *  client that is communicating with this server application.
  65.  *  This is the only point where there is direct communication
  66.  *  between the two applciations.
  67.  *
  68.  * Parameters:
  69.  *  pObj            LPCOSMOOBJECT that contains a pClient pointer to an
  70.  *                  LPOLECLIENT that holds a pointer to the OLECLIENTVTBL
  71.  *                  that holds a pointer to the CallBack function.
  72.  *  iMsg            UINT, message to send, such as OLE_CLOSED.
  73.  *
  74.  * Return Value:
  75.  *  None.
  76.  */
  77. void WINAPI OLEClientNotify(LPCOSMOOBJECT pObj, UINT iMsg)
  78.     {
  79.     LPOLECLIENT     pClient;
  80.     LPOLECLIENTVTBL pvt;
  81.     if (NULL==pObj)
  82.         return;
  83.     pClient=pObj->pClient;
  84.     if (NULL==pClient)
  85.         return;
  86.     pvt=pClient->lpvtbl;
  87.     if (NULL==pvt)
  88.         return;
  89.     (pvt->CallBack)(pClient, iMsg, (LPOLEOBJECT)pObj);
  90.     return;
  91.     }
  92. /*
  93.  * FOLEReleaseWait
  94.  *
  95.  * Purpose:
  96.  *  Enters a Peek/Translate/Dispatch message loop to process all messages
  97.  *  to the application until a release flag has been sent.  The application
  98.  *  calls this routine whenever it is required to wait until conversations
  99.  *  for OLE have terminated.
  100.  *
  101.  *  Some of the messages processed may be DDE messages (for OLE 1.x) that
  102.  *  are eventually passed to OLESVR which eventually calls the ServerRelease
  103.  *  function (see OLESVR.C).  ServerRelease modifies a BOOL flag indicating
  104.  *  that the server is released.
  105.  *
  106.  *  Therefore we can watch a particular memory location (*pf)
  107.  *  and only exit when that flag is set.
  108.  *
  109.  * Parameters:
  110.  *  pf              BOOL FAR * to the flag to wait on.
  111.  *  lhSvr           LONG for the OLE server
  112.  *
  113.  * Return Value:
  114.  *  BOOL            Contents of *pf.
  115.  *
  116.  */
  117. BOOL WINAPI FOLEReleaseWait(BOOL FAR *pf, LONG lhSvr)
  118.     {
  119.     MSG        msg;
  120.     *pf=FALSE;
  121.     while (FALSE==*pf)
  122.         {
  123.         /*
  124.          * We use PeekMessage here to make a point about power
  125.          * management and ROM Windows--GetMessage, when there's
  126.          * no more messages, will correctly let the system go into
  127.          * a low-power idle state.  PeekMessage by itself will not.
  128.          * If you do background processing in a PeekMessage loop like
  129.          * this, and there's no background processing to be done,
  130.          * then you MUST call WaitMessage to duplicate the idle
  131.          * state like GetMessage.
  132.          */
  133.         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  134.             {
  135.             /*
  136.              * We will not see WM_QUIT in the middle of the
  137.              * application since this application MUST call
  138.              * PostQuitMessage to get it in the queue.  Therefore we
  139.              * don't even worry about it.
  140.              */
  141.             TranslateMessage (&msg);
  142.             DispatchMessage (&msg);
  143.             }
  144.         else
  145.             {
  146.             /*
  147.              * If the application has some background processing
  148.              * to do, it should perform a piece of it here.  Otherwise
  149.              * you MUST call WaitMessage or you'll screw up ROM-Windows
  150.              * power-management.
  151.              */
  152.             WaitMessage();
  153.             }
  154.         }
  155.     return *pf;
  156.     }
  157. #endif //MAKEOLESERVER