Annotation of mstools/ole20/samples/outline/oleapp.c, revision 1.1

1.1     ! root        1: /*************************************************************************
        !             2: **
        !             3: **    OLE 2 Sample Code
        !             4: **
        !             5: **    oleapp.c
        !             6: **
        !             7: **    This file contains functions and methods that are common to
        !             8: **    server and the client version of the app. This includes the class
        !             9: **    factory methods and all OleApp functions.
        !            10: **
        !            11: **    (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
        !            12: **
        !            13: *************************************************************************/
        !            14: 
        !            15: #include "outline.h"
        !            16: #include <ole2ver.h>
        !            17: 
        !            18: OLEDBGDATA
        !            19: 
        !            20: extern LPOUTLINEAPP             g_lpApp;
        !            21: 
        !            22: extern IUnknownVtbl             g_OleApp_UnknownVtbl;
        !            23: 
        !            24: extern IUnknownVtbl             g_OleDoc_UnknownVtbl;
        !            25: extern IPersistFileVtbl         g_OleDoc_PersistFileVtbl;
        !            26: extern IOleItemContainerVtbl    g_OleDoc_OleItemContainerVtbl;
        !            27: extern IDataObjectVtbl          g_OleDoc_DataObjectVtbl;
        !            28: 
        !            29: #if defined( USE_DRAGDROP )
        !            30: extern IDropTargetVtbl          g_OleDoc_DropTargetVtbl;
        !            31: extern IDropSourceVtbl          g_OleDoc_DropSourceVtbl;
        !            32: #endif  // USE_DRAGDROP
        !            33: 
        !            34: #if defined( OLE_SERVER )
        !            35: extern IOleObjectVtbl       g_SvrDoc_OleObjectVtbl;
        !            36: extern IPersistStorageVtbl  g_SvrDoc_PersistStorageVtbl;
        !            37: 
        !            38: #if defined( SVR_TREATAS )
        !            39: extern IStdMarshalInfoVtbl  g_SvrDoc_StdMarshalInfoVtbl;
        !            40: #endif  // SVR_TREATAS
        !            41: 
        !            42: extern IUnknownVtbl         g_PseudoObj_UnknownVtbl;
        !            43: extern IOleObjectVtbl       g_PseudoObj_OleObjectVtbl;
        !            44: extern IDataObjectVtbl      g_PseudoObj_DataObjectVtbl;
        !            45: 
        !            46: #if defined( INPLACE_SVR )
        !            47: extern IOleInPlaceObjectVtbl        g_SvrDoc_OleInPlaceObjectVtbl;
        !            48: extern IOleInPlaceActiveObjectVtbl  g_SvrDoc_OleInPlaceActiveObjectVtbl;
        !            49: #endif  // INPLACE_SVR
        !            50: 
        !            51: #endif  // OLE_SERVER
        !            52: 
        !            53: #if defined( OLE_CNTR )
        !            54: 
        !            55: extern IOleUILinkContainerVtbl g_CntrDoc_OleUILinkContainerVtbl;
        !            56: extern IUnknownVtbl                            g_CntrLine_UnknownVtbl;
        !            57: extern IOleClientSiteVtbl              g_CntrLine_OleClientSiteVtbl;
        !            58: extern IAdviseSinkVtbl                 g_CntrLine_AdviseSinkVtbl;
        !            59: 
        !            60: #if defined( INPLACE_CNTR )
        !            61: extern IOleInPlaceSiteVtbl             g_CntrLine_OleInPlaceSiteVtbl;
        !            62: extern IOleInPlaceFrameVtbl            g_CntrApp_OleInPlaceFrameVtbl;
        !            63: extern BOOL g_fInsideOutContainer;
        !            64: #endif  // INPLACE_CNTR
        !            65: 
        !            66: #endif  // OLE_CNTR
        !            67: 
        !            68: // REVIEW: these are NOT useful end-user messages
        !            69: static char ErrMsgCreateCF[] = "Can't create Class Factory!";
        !            70: static char ErrMsgRegCF[] = "Can't register Class Factory!";
        !            71: static char ErrMsgRegMF[] = "Can't register Message Filter!";
        !            72: 
        !            73: extern UINT g_uMsgHelp;
        !            74: 
        !            75: /* OleApp_InitInstance
        !            76:  * -------------------
        !            77:  *
        !            78:  * Initialize the app instance by creating the main frame window and
        !            79:  * performing app instance specific initializations
        !            80:  *  (eg. initializing interface Vtbls).
        !            81:  *
        !            82:  * RETURNS: TRUE if the memory could be allocated, and the server app
        !            83:  *               was properly initialized.
        !            84:  *          FALSE otherwise
        !            85:  *
        !            86:  */
        !            87: BOOL OleApp_InitInstance(LPOLEAPP lpOleApp, HINSTANCE hInst, int nCmdShow)
        !            88: {
        !            89:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !            90:     HRESULT hrErr;
        !            91:     DWORD   dwBuildVersion = OleBuildVersion();
        !            92: 
        !            93:     OLEDBG_BEGIN3("OleApp_InitInstance\r\n")
        !            94: 
        !            95:     lpOleApp->m_fOleInitialized = FALSE;
        !            96: 
        !            97:     /* OLE2NOTE: check if the build version of the OLE2 DLL's match
        !            98:     **    what our application is expecting.
        !            99:     */
        !           100:     if (HIWORD(dwBuildVersion) != rmm || LOWORD(dwBuildVersion) < rup) {
        !           101:         OleDbgAssertSz(0, "ERROR: OLE 2.0 DLL's are NOT compatible!");
        !           102: 
        !           103: #if !defined( _DEBUG )
        !           104:         return FALSE;   // Wrong version of DLL's
        !           105: #endif
        !           106:     }
        !           107: 
        !           108:     /* OLE2NOTE: the OLE libraries must be properly initialized before
        !           109:     **    making any calls. OleInitialize automatically calls
        !           110:     **    CoInitialize. we will use the default task memory allocator
        !           111:     **    therefore we pass NULL to OleInitialize.
        !           112:     */
        !           113:     OLEDBG_BEGIN2("OleInitialize called\r\n")
        !           114:     hrErr = OleInitialize(NULL);
        !           115:     OLEDBG_END2
        !           116: 
        !           117:     if (hrErr != NOERROR) {
        !           118:         OutlineApp_ErrorMessage(lpOutlineApp,"OLE initialization failed!");
        !           119:         goto error;
        !           120:     }
        !           121: 
        !           122:     /*****************************************************************
        !           123:     ** OLE2NOTE: we must remember the fact that OleInitialize has
        !           124:     **    been call successfully. the very last thing an app must
        !           125:     **    be do is properly shut down OLE by calling
        !           126:     **    OleUninitialize. This call MUST be guarded! it is only
        !           127:     **    allowable to call OleUninitialize if OleInitialize has
        !           128:     **    been called SUCCESSFULLY.
        !           129:     *****************************************************************/
        !           130: 
        !           131:     lpOleApp->m_fOleInitialized = TRUE;
        !           132: 
        !           133:     // Initialize the OLE 2.0 interface method tables.
        !           134:     if (! OleApp_InitVtbls(lpOleApp))
        !           135:         goto error;
        !           136: 
        !           137:     // Register OLE 2.0 clipboard formats.
        !           138:     lpOleApp->m_cfEmbedSource = RegisterClipboardFormat(CF_EMBEDSOURCE);
        !           139:     lpOleApp->m_cfEmbeddedObject = RegisterClipboardFormat(
        !           140:             CF_EMBEDDEDOBJECT
        !           141:     );
        !           142:     lpOleApp->m_cfLinkSource = RegisterClipboardFormat(CF_LINKSOURCE);
        !           143:     lpOleApp->m_cfFileName = RegisterClipboardFormat(CF_FILENAME);
        !           144:     lpOleApp->m_cfObjectDescriptor = 
        !           145:             RegisterClipboardFormat(CF_OBJECTDESCRIPTOR); 
        !           146:     lpOleApp->m_cfLinkSrcDescriptor = 
        !           147:             RegisterClipboardFormat(CF_LINKSRCDESCRIPTOR); 
        !           148:     
        !           149:     lpOleApp->m_cRef                    = 0;
        !           150:     lpOleApp->m_cDoc                    = 0;
        !           151:     lpOleApp->m_fUserCtrl               = FALSE;
        !           152:     lpOleApp->m_dwRegClassFac           = 0;
        !           153:     lpOleApp->m_lpClassFactory          = NULL;
        !           154: 
        !           155:     INIT_INTERFACEIMPL(
        !           156:             &lpOleApp->m_Unknown,
        !           157:             &g_OleApp_UnknownVtbl,
        !           158:             lpOleApp
        !           159:     );
        !           160: 
        !           161: #if defined( USE_DRAGDROP )
        !           162:     // time delay (in msec) before scroll
        !           163:     lpOleApp->m_nScrollDelay = GetProfileInt(
        !           164:             "windows",
        !           165:             "ScrollDelay",
        !           166:             DD_DEFSCROLLDELAY
        !           167:     );
        !           168: 
        !           169:     // Border threshold to start drag scroll
        !           170:     lpOleApp->m_nScrollInset = GetProfileInt(
        !           171:             "windows",
        !           172:             "ScrollInset",
        !           173:             DD_DEFSCROLLINSET
        !           174:     );                                           
        !           175: 
        !           176:     /* OLE2NOTE: even though OLE provides default cursors for
        !           177:     **    drag/drop, we need to have a copy of the dragmove cursor so
        !           178:     **    that we can give immediate feedback on cursor down of a
        !           179:     **    pending drag operation. we do not call DoDragDrop immediately
        !           180:     **    on button down; the user must move the mouse a minimum
        !           181:     **    distance to start the drag. we will show this cursor
        !           182:     **    immediately, however, to show the user there is a drag
        !           183:     **    pending. 
        !           184:     */
        !           185:     lpOleApp->m_hcursorDragMove  = LoadCursor ( hInst, "DragMoveCur" );
        !           186: 
        !           187: #if defined( IF_SPECIAL_DD_CURSORS_NEEDED )                       
        !           188:     // This would be used if the app wanted to have custom drag/drop cursors
        !           189:     lpOleApp->m_hcursorDragNone  = LoadCursor ( hInst, "DragNoneCur" );
        !           190:     lpOleApp->m_hcursorDragCopy  = LoadCursor ( hInst, "DragCopyCur" );
        !           191:     lpOleApp->m_hcursorDragLink  = LoadCursor ( hInst, "DragLinkCur" );
        !           192: #endif  // IF_SPECIAL_DD_CURSORS_NEEDED
        !           193: 
        !           194: #endif  // USE_DRAGDROP
        !           195: 
        !           196:     lpOleApp->m_lpMsgFilter = NULL;
        !           197: 
        !           198: #if defined( USE_MSGFILTER )
        !           199:     /* OLE2NOTE: Register our message filter upon app startup. the
        !           200:     **    message filter is used to handle concurrency.
        !           201:     **    we will use a standard implementation of IMessageFilter that
        !           202:     **    is included as part of the OLE2UI library.
        !           203:     */
        !           204:     lpOleApp->m_lpMsgFilter = NULL;
        !           205:     if (! OleApp_RegisterMessageFilter(lpOleApp))
        !           206:         goto error;
        !           207: 
        !           208:     /* OLE2NOTE: because our app is initially INVISIBLE, we must
        !           209:     **    DISABLE the busy dialog. we should NOT put up any dialogs if
        !           210:     **    our app is invisible. when our app window is made visible,
        !           211:     **    then the busy dialog will be enabled.
        !           212:     */
        !           213:     OleStdMsgFilter_EnableBusyDialog(lpOleApp->m_lpMsgFilter, FALSE);
        !           214: #endif  // USE_MSGFILTER
        !           215: 
        !           216: #if defined( OLE_SERVER )
        !           217: 
        !           218:     /* OLE2NOTE: perform initialization specific for an OLE server */
        !           219:     if (! ServerApp_InitInstance((LPSERVERAPP)lpOutlineApp, hInst, nCmdShow))
        !           220:         goto error;
        !           221: 
        !           222: #elif defined( OLE_CNTR )
        !           223: 
        !           224:     /* OLE2NOTE: perform initialization specific for an OLE container */
        !           225: 
        !           226:     // Register help message
        !           227:     g_uMsgHelp = RegisterWindowMessage(SZOLEUI_MSG_HELP);
        !           228: 
        !           229:     if (! ContainerApp_InitInstance((LPCONTAINERAPP)lpOutlineApp, hInst, nCmdShow))
        !           230:         goto error;
        !           231: 
        !           232: #endif
        !           233: 
        !           234:     OLEDBG_END3
        !           235:     return TRUE;
        !           236: 
        !           237: error:
        !           238:     OLEDBG_END3
        !           239:     return FALSE;
        !           240: }
        !           241: 
        !           242: 
        !           243: /*
        !           244:  * OleApp_TerminateApplication
        !           245:  * ---------------------------
        !           246:  *  Perform proper OLE application cleanup before shutting down
        !           247:  */
        !           248: void OleApp_TerminateApplication(LPOLEAPP lpOleApp)
        !           249: {
        !           250:     OLEDBG_BEGIN3("OleApp_TerminateApplication\r\n")
        !           251: 
        !           252:     /* OLE2NOTE: perform a clean shut down for OLE. at this point our
        !           253:     **    App refcnt should be 0, or else we should never have reached
        !           254:     **    this point!
        !           255:     */
        !           256:     OleDbgAssertSz(lpOleApp->m_cRef == 0, "App NOT shut down properly");
        !           257: 
        !           258:     if(lpOleApp->m_fOleInitialized) {
        !           259:         OLEDBG_BEGIN2("OleUninitialize called\r\n")
        !           260: 
        !           261:         OleUninitialize();
        !           262: 
        !           263:         OLEDBG_END2
        !           264:     }
        !           265:     OLEDBG_END3
        !           266: }
        !           267: 
        !           268: 
        !           269: /* OleApp_ParseCmdLine
        !           270:  * -------------------
        !           271:  *
        !           272:  * Parse the command line for any execution flags/arguments.
        !           273:  *      OLE2NOTE: check if "-Embedding" switch is given.
        !           274:  */
        !           275: BOOL OleApp_ParseCmdLine(LPOLEAPP lpOleApp, LPSTR lpszCmdLine, int nCmdShow)
        !           276: {
        !           277:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !           278:     char szFileName[256];   /* buffer for filename in command line */
        !           279:     BOOL fStatus = TRUE;
        !           280:     BOOL fEmbedding = FALSE;
        !           281: 
        !           282:     OLEDBG_BEGIN3("OleApp_ParseCmdLine\r\n")
        !           283: 
        !           284:     szFileName[0] = '\0';
        !           285:     ParseCmdLine(lpszCmdLine, &fEmbedding, (LPSTR)szFileName);
        !           286: 
        !           287: #if defined( MDI_VERSION )
        !           288:     /* OLE2NOTE: an MDI app would ALWAYS register its ClassFactory. it
        !           289:     **    can handle multiple objects at the same time, while an SDI
        !           290:     **    application can only handle a single embedded or file-based
        !           291:     **    object at a time.
        !           292:     */
        !           293:     fStatus = OleApp_RegisterClassFactory(lpOleApp);
        !           294: #endif
        !           295: 
        !           296:     if(fEmbedding) {
        !           297: 
        !           298:         if (szFileName[0] == '\0') {
        !           299: 
        !           300:             /*****************************************************************
        !           301:             ** App was launched with /Embedding.
        !           302:             **    We must register our ClassFactory with OLE, remain hidden
        !           303:             **    (the app window is initially created not visible), and
        !           304:             **    wait for OLE to call IClassFactory::CreateInstance
        !           305:             **    method. We do not automatically create a document as we
        !           306:             **    do when the app is launched by the user from the
        !           307:             **    FileManager. We must NOT make our app window visible
        !           308:             **    until told to do so by our container.
        !           309:             **
        !           310:             ** OLE2NOTE: Because we are an SDI app, we only register our
        !           311:             **    ClassFactory if we are launched with the /Embedding
        !           312:             **    flag WITHOUT a filename. an MDI app would ALWAYS
        !           313:             **    register its ClassFactory. it can handle multiple
        !           314:             **    objects at the same time, while an SDI application
        !           315:             **    can only handle a single embedded or file-based
        !           316:             **    object at a time.
        !           317:             *****************************************************************/
        !           318: 
        !           319: #if defined( SDI_VERSION )
        !           320:             fStatus = OleApp_RegisterClassFactory(lpOleApp);
        !           321: #endif 
        !           322:         } else {
        !           323: 
        !           324:             /*****************************************************************
        !           325:             ** App was launched with /Embedding <Filename>.
        !           326:             **    We must create a document and load the file and
        !           327:             **    register it in the RunningObjectTable BEFORE we
        !           328:             **    enter our GetMessage loop (ie. before we yield). 
        !           329:             **    One way to perform these tasks is to call the same
        !           330:             **    interface methods that OLE 2.0 calls for linking to a
        !           331:             **    file:
        !           332:             **          IClassFactory::CreateInstance
        !           333:             **          IPersistFile::Load
        !           334:             **    
        !           335:             **    We must NOT make our app window visible until told to
        !           336:             **    do so by our container. An application will be
        !           337:             **    launched in this manner by an OLE 1.0 application
        !           338:             **    link situation (eg. double clicking a linked object
        !           339:             **    or OleCreateLinkFromFile called).
        !           340:             **
        !           341:             ** OLE2NOTE: Because we are an SDI app, we should NOT
        !           342:             **    register our ClassFactory when we are launched with the
        !           343:             **    /Embedding <Filename> flag. our SDI instance can only
        !           344:             **    handle a single embedded or file-based object.
        !           345:             **    an MDI app WOULD register its ClassFactory at all
        !           346:             **    times because it can handle multiple objects.
        !           347:             *****************************************************************/
        !           348:             
        !           349:             // allocate a new document object
        !           350:             lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !           351:             if (! lpOutlineApp->m_lpDoc) {
        !           352:                 OLEDBG_END3
        !           353:                 return FALSE;   
        !           354:             }
        !           355: 
        !           356:             /* OLE2NOTE: initially the Doc object is created with a 0 ref
        !           357:             **    count. in order to have a stable Doc object during the
        !           358:             **    process of initializing the new Doc instance,
        !           359:             **    we intially AddRef the Doc ref cnt and later
        !           360:             **    Release it. This initial AddRef is artificial; it is simply
        !           361:             **    done to guarantee that a harmless QueryInterface followed by
        !           362:             **    a Release does not inadvertantly force our object to destroy
        !           363:             **    itself prematurely.
        !           364:             */
        !           365:             OleDoc_AddRef((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !           366: 
        !           367:             /* OLE2NOTE: OutlineDoc_LoadFromFile will register our document
        !           368:             **    in the RunningObjectTable. this registration will
        !           369:             **    AddRef our document. therefore our document will not
        !           370:             **    be destroyed when we release the artificial AddRef
        !           371:             */
        !           372:             fStatus = OutlineDoc_LoadFromFile(
        !           373:                     lpOutlineApp->m_lpDoc, (LPSTR)szFileName);
        !           374: 
        !           375:             OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc); // rel AddRef 
        !           376: 
        !           377:             OLEDBG_END3
        !           378:             return fStatus;
        !           379:         }
        !           380:     } else {
        !           381: 
        !           382:         /*****************************************************************
        !           383:         ** App was launched by the user (without /Embedding) and
        !           384:         **    therefore is marked to be under user control.
        !           385:         **    In this case, because we are an SDI app, we do NOT
        !           386:         **    register our ClassFactory with OLE. This app instance can
        !           387:         **    only manage one document at a time (either a user
        !           388:         **    document or an embedded object document). An MDI app
        !           389:         **    would register its ClassFactory here.
        !           390:         **
        !           391:         **    We must create a document for the user (either
        !           392:         **    initialized from a file given on the command line or
        !           393:         **    initialized as an untitled document. We must also make
        !           394:         **    our app window visible to the user.
        !           395:         *****************************************************************/
        !           396: 
        !           397:         // allocate a new document object
        !           398:         lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !           399:         if (! lpOutlineApp->m_lpDoc) goto error;
        !           400: 
        !           401:         /* OLE2NOTE: initially the Doc object is created with a 0 ref
        !           402:         **    count. in order to have a stable Doc object during the
        !           403:         **    process of initializing the new Doc instance,
        !           404:         **    we intially AddRef the Doc ref cnt and later
        !           405:         **    Release it. This initial AddRef is artificial; it is simply
        !           406:         **    done to guarantee that a harmless QueryInterface followed by
        !           407:         **    a Release does not inadvertantly force our object to destroy
        !           408:         **    itself prematurely.
        !           409:         */
        !           410:         OleDoc_AddRef((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !           411: 
        !           412:         if(*szFileName) {
        !           413:             // initialize the document from the specified file
        !           414:             if (! OutlineDoc_LoadFromFile(lpOutlineApp->m_lpDoc, szFileName))
        !           415:                 goto error;
        !           416:         } else {
        !           417:             // set the doc to an (Untitled) doc.
        !           418:             if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
        !           419:                 goto error;
        !           420:         }
        !           421: 
        !           422:         // position and size the new doc window
        !           423:         OutlineApp_ResizeWindows(lpOutlineApp);
        !           424:         OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc); // calls OleDoc_Lock
        !           425:         OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc);// rel AddRef above
        !           426: 
        !           427:         // show main app window
        !           428:         ShowWindow(lpOutlineApp->m_hWndApp, nCmdShow);
        !           429:         UpdateWindow(lpOutlineApp->m_hWndApp);
        !           430:                
        !           431: #if defined( OLE_CNTR )
        !           432:                ContainerDoc_UpdateLinks((LPCONTAINERDOC)lpOutlineApp->m_lpDoc);
        !           433: #endif 
        !           434:        
        !           435:     }
        !           436: 
        !           437:     OLEDBG_END3
        !           438:     return fStatus;
        !           439: 
        !           440: error:
        !           441:     // REVIEW: should load string from string resource
        !           442:     OutlineApp_ErrorMessage(
        !           443:             lpOutlineApp,
        !           444:             "Could not create document--Out of Memory"
        !           445:     );
        !           446:     if (lpOutlineApp->m_lpDoc)      // rel artificial AddRef above
        !           447:         OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !           448: 
        !           449:     OLEDBG_END3
        !           450:     return FALSE;
        !           451: }
        !           452: 
        !           453: 
        !           454: /* OleApp_CloseAllDocsAndExitCommand
        !           455:  * ---------------------------------
        !           456:  *
        !           457:  *  Close all active documents and exit the app.
        !           458:  *  Because this is an SDI, there is only one document
        !           459:  *  If the doc was modified, prompt the user if he wants to save it.
        !           460:  *
        !           461:  *  Returns:
        !           462:  *      TRUE if the app is successfully closed
        !           463:  *      FALSE if failed or aborted
        !           464:  *
        !           465:  * OLE2NOTE: in the OLE version, we can NOT directly
        !           466:  *     destroy the App object. we can only take all
        !           467:  *     necessary actions to ensure that our object receives
        !           468:  *     all of its Releases from clients holding onto
        !           469:  *     pointers (eg. closing all docs and flushing the
        !           470:  *     clipboard) and then we must hide our window and wait
        !           471:  *     actually for our refcnt to reach 0. when it reaches 0,
        !           472:  *     our destructor (OutlineApp_Destroy) will be called.
        !           473:  *     each document addref's the app object in order to
        !           474:  *     guarentee that the app does not shut down while the doc
        !           475:  *     is still open. closing all docs, will release these
        !           476:  *     refcnt's. if there are now more open documents AND the
        !           477:  *     app is not under the control of the user (ie. launched by
        !           478:  *     OLE) then the app will now shut down. the OleApp_Release
        !           479:  *     function executes this shut down procedure. after closing
        !           480:  *     all docs, then releasing the user refcnt will force the
        !           481:  *     app to shut down.
        !           482:  */
        !           483: BOOL OleApp_CloseAllDocsAndExitCommand(LPOLEAPP lpOleApp)
        !           484: {
        !           485:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !           486:     DWORD dwSaveOption = OLECLOSE_PROMPTSAVE;
        !           487: 
        !           488:     /* OLE2NOTE: in order to have a stable App object during the
        !           489:     **    process of closing, we intially AddRef the App ref cnt and
        !           490:     **    later Release it. This initial AddRef is artificial; it is
        !           491:     **    simply done to guarantee that our App object does not
        !           492:     **    destroy itself until the end of this routine.
        !           493:     */
        !           494:     OleApp_AddRef(lpOleApp);
        !           495: 
        !           496:     /* Because this is an SDI app, there is only one document.
        !           497:     ** Close the doc. if it is successfully closed and the app will
        !           498:     ** not automatically exit, then also exit the app.
        !           499:     ** if this were an MDI app, we would loop through and close all
        !           500:     ** open MDI child documents.
        !           501:     */
        !           502:     
        !           503: #if defined( OLE_SERVER )
        !           504:     if (lpOutlineApp->m_lpDoc->m_docInitType == DOCTYPE_EMBEDDED) 
        !           505:         dwSaveOption = OLECLOSE_SAVEIFDIRTY;
        !           506: #endif    
        !           507:     if (! OutlineDoc_Close(lpOutlineApp->m_lpDoc, dwSaveOption)) {
        !           508:         OleApp_Release(lpOleApp);
        !           509:         return FALSE;     // User Aborted shutdown
        !           510:     }
        !           511: 
        !           512:     OleDbgAssertSz(
        !           513:             lpOutlineApp->m_lpDoc==NULL,
        !           514:             "Closed doc NOT properly destroyed"
        !           515:     );
        !           516: 
        !           517: #if defined( OLE_CNTR )
        !           518:     /* if we currently have data on the clipboard then we must tell
        !           519:     **    the clipboard to release our clipboard data object
        !           520:     **    (document)
        !           521:     */
        !           522:     if (lpOutlineApp->m_lpClipboardDoc)
        !           523:         OleApp_FlushClipboard(lpOleApp);
        !           524: #endif
        !           525: 
        !           526:     OleApp_HideWindow(lpOleApp);
        !           527: 
        !           528:     /* OLE2NOTE: this call forces all external connections to our
        !           529:     **    object to close down and therefore guarantees that we receive
        !           530:     **    all releases associated with those external connections.
        !           531:     */
        !           532:     OLEDBG_BEGIN2("CoDisconnectObject(lpApp) called\r\n")
        !           533:     CoDisconnectObject((LPUNKNOWN)&lpOleApp->m_Unknown, 0);
        !           534:     OLEDBG_END2
        !           535: 
        !           536:     OleApp_Release(lpOleApp);       // release artificial AddRef above
        !           537: 
        !           538:     return TRUE;
        !           539: }
        !           540: 
        !           541: 
        !           542: /* OleApp_ShowWindow
        !           543:  * -----------------
        !           544:  *
        !           545:  *      Show the window of the app to the user.
        !           546:  *      make sure app window is visible and bring the app to the top.
        !           547:  *      IF fGiveUserCtrl == TRUE
        !           548:  *          THEN give the user the control over the life-time of the app.
        !           549:  */
        !           550: void OleApp_ShowWindow(LPOLEAPP lpOleApp, BOOL fGiveUserCtrl)
        !           551: {
        !           552:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !           553: 
        !           554:     OLEDBG_BEGIN3("OleApp_ShowWindow\r\n")
        !           555: 
        !           556:     /* OLE2NOTE: while the application is visible and under user
        !           557:     **    control, we do NOT want it to be prematurely destroyed when
        !           558:     **    the user closes a document. thus we must inform OLE to hold
        !           559:     **    an external lock on our application on behalf of the user.
        !           560:     **    this arranges that OLE holds at least 1 reference to our
        !           561:     **    application that will NOT be released until we release this
        !           562:     **    external lock. later, when the application window is hidden, we
        !           563:     **    will release this external lock.
        !           564:     */
        !           565:     if (fGiveUserCtrl && ! lpOleApp->m_fUserCtrl) {
        !           566:         lpOleApp->m_fUserCtrl = TRUE;
        !           567:         OleApp_Lock(lpOleApp, TRUE /* fLock */, 0 /* not applicable */);
        !           568:     }
        !           569: 
        !           570:     // we must show our App window and force it to have input focus
        !           571:     ShowWindow(lpOutlineApp->m_hWndApp, SW_SHOWNORMAL);
        !           572:     SetFocus(lpOutlineApp->m_hWndApp);
        !           573: 
        !           574:     /* OLE2NOTE: because our app is now visible, we can enable the busy
        !           575:     **    dialog. we should NOT put up any dialogs if our app is
        !           576:     **    invisible. 
        !           577:     */
        !           578:     if (lpOleApp->m_lpMsgFilter != NULL)
        !           579:         OleStdMsgFilter_EnableBusyDialog(lpOleApp->m_lpMsgFilter, TRUE);
        !           580: 
        !           581:     OLEDBG_END3
        !           582: }
        !           583: 
        !           584: 
        !           585: /* OleApp_HideWindow
        !           586:  * -----------------
        !           587:  *
        !           588:  *      Hide the window of the app from the user.
        !           589:  *      take away the control of the app by the user.
        !           590:  */
        !           591: void OleApp_HideWindow(LPOLEAPP lpOleApp)
        !           592: {
        !           593:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !           594: 
        !           595:     OLEDBG_BEGIN3("OleApp_HideWindow\r\n")
        !           596: 
        !           597:     /* OLE2NOTE: the application is now being hidden, so we must release
        !           598:     **    the external lock that was made on behalf of the user.
        !           599:     **    if this is that last external lock on our application, thus
        !           600:     **    enabling our application to complete its shutdown operation.
        !           601:     */
        !           602:     if (lpOleApp->m_fUserCtrl) {
        !           603:         lpOleApp->m_fUserCtrl = FALSE;
        !           604:         OleApp_Lock(lpOleApp, FALSE /*fLock*/, TRUE /*fLastUnlockReleases*/);
        !           605:     }
        !           606: 
        !           607:     ShowWindow(lpOutlineApp->m_hWndApp, SW_HIDE);
        !           608: 
        !           609:     /* OLE2NOTE: because our app is now INVISIBLE, we must DISABLE the busy
        !           610:     **    dialog. we should NOT put up any dialogs if our app is
        !           611:     **    invisible. 
        !           612:     */
        !           613:     if (lpOleApp->m_lpMsgFilter != NULL)
        !           614:         OleStdMsgFilter_EnableBusyDialog(lpOleApp->m_lpMsgFilter, FALSE);
        !           615: 
        !           616:     OLEDBG_END3
        !           617: }
        !           618: 
        !           619: 
        !           620: /* OleApp_Lock
        !           621: ** -----------
        !           622: **    Lock/Unlock the App object. if the last lock is unlocked and
        !           623: **    fLastUnlockReleases == TRUE, then the app object will shut down
        !           624: **    (ie. it will recieve its final release and its refcnt will go to 0).
        !           625: */
        !           626: HRESULT OleApp_Lock(LPOLEAPP lpOleApp, BOOL fLock, BOOL fLastUnlockReleases)
        !           627: {
        !           628:     HRESULT hrErr;
        !           629: 
        !           630: #if defined( _DEBUG )
        !           631:     if (fLock) {
        !           632:         OLEDBG_BEGIN2("CoLockObjectExternal(lpApp,TRUE) called\r\n")
        !           633:     } else {
        !           634:         if (fLastUnlockReleases) 
        !           635:             OLEDBG_BEGIN2("CoLockObjectExternal(lpApp,FALSE,TRUE) called\r\n")
        !           636:         else
        !           637:             OLEDBG_BEGIN2("CoLockObjectExternal(lpApp,FALSE,FALSE) called\r\n")
        !           638:     }
        !           639: #endif  // _DEBUG
        !           640: 
        !           641:     OleApp_AddRef(lpOleApp);       // artificial AddRef to make object stable
        !           642: 
        !           643:     hrErr = CoLockObjectExternal(
        !           644:             (LPUNKNOWN)&lpOleApp->m_Unknown, fLock, fLastUnlockReleases);
        !           645: 
        !           646:     OleApp_Release(lpOleApp);       // release artificial AddRef above
        !           647: 
        !           648:     OLEDBG_END2
        !           649:     return hrErr;
        !           650: }
        !           651: 
        !           652: 
        !           653: /* OleApp_Destroy
        !           654:  * --------------
        !           655:  *
        !           656:  *  Free all OLE related resources that had been allocated for the app.  
        !           657:  */
        !           658: void OleApp_Destroy(LPOLEAPP lpOleApp)
        !           659: {
        !           660:     // OLE2NOTE: Revoke our message filter upon app shutdown.
        !           661:     OleApp_RevokeMessageFilter(lpOleApp);
        !           662: 
        !           663:     // OLE2NOTE: Revoke our ClassFactory upon app shutdown.
        !           664:     OleApp_RevokeClassFactory(lpOleApp);
        !           665:     
        !           666: #if defined( DRAGDROP )
        !           667: 
        !           668:     DestroyCursor(lpOleApp->m_hcursorDragMove);
        !           669: 
        !           670: #if defined( IF_SPECIAL_DD_CURSORS_NEEDED )
        !           671:     // This would be used if the app wanted to have custom drag/drop cursors
        !           672:     DestroyCursor(lpOleApp->m_hcursorDragNone);
        !           673:     DestroyCursor(lpOleApp->m_hcursorDragCopy);
        !           674:     DestroyCursor(lpOleApp->m_hcursorDragLink);
        !           675: #endif  // IF_SPECIAL_DD_CURSORS_NEEDED
        !           676: 
        !           677: #endif  // DRAGDROP
        !           678: 
        !           679: }
        !           680: 
        !           681: 
        !           682: /* OleApp_DocLockApp
        !           683: ** -----------------
        !           684: **    Add a lock on the App on behalf of the Doc. the App may not close
        !           685: **    while the Doc exists.
        !           686: **
        !           687: **    when a document is first created, it calls this method to
        !           688: **    guarantee that the application stays alive (OleDoc_Init).
        !           689: **    when a document is destroyed, it calls
        !           690: **    OleApp_DocUnlockApp to release this hold on the app.
        !           691: */
        !           692: void OleApp_DocLockApp(LPOLEAPP lpOleApp)
        !           693: {
        !           694:     ULONG cDoc;
        !           695: 
        !           696:     OLEDBG_BEGIN3("OleApp_DocLockApp\r\n")
        !           697: 
        !           698:     cDoc = ++lpOleApp->m_cDoc;
        !           699: 
        !           700:     OleDbgOutRefCnt3(
        !           701:             "OleApp_DocLockApp: cDoc++\r\n", lpOleApp, cDoc);
        !           702: 
        !           703:     OleApp_Lock(lpOleApp, TRUE /* fLock */, 0 /* not applicable */);
        !           704: 
        !           705:     OLEDBG_END3
        !           706:     return;
        !           707: }
        !           708: 
        !           709: 
        !           710: /* OleApp_DocUnlockApp
        !           711: ** -------------------
        !           712: **    Forget all references to a closed document.
        !           713: **    Release the lock on the App on behalf of the Doc. if this was the
        !           714: **    last lock on the app, then it will shutdown.
        !           715: */
        !           716: void OleApp_DocUnlockApp(LPOLEAPP lpOleApp, LPOUTLINEDOC lpOutlineDoc)
        !           717: {
        !           718:     ULONG cDoc;
        !           719: 
        !           720:     OLEDBG_BEGIN3("OleApp_DocUnlockApp\r\n")
        !           721: 
        !           722:     /* OLE2NOTE: when there are no open documents and the app is not
        !           723:     **    under the control of the user then revoke our ClassFactory to
        !           724:     **    enable the app to shut down.
        !           725:     */
        !           726:     OleDbgAssertSz (lpOleApp->m_cDoc > 0, "DocUnlockApp called with cDoc == 0");
        !           727: 
        !           728:     cDoc = --lpOleApp->m_cDoc;
        !           729: 
        !           730:     OleDbgOutRefCnt3(
        !           731:             "OleApp_DocUnlockApp: cDoc--\r\n", lpOleApp, cDoc);
        !           732: 
        !           733:     OleApp_Lock(lpOleApp, FALSE /* fLock */, TRUE /* fLastUnlockReleases */);
        !           734: 
        !           735:     OLEDBG_END3
        !           736:     return;
        !           737: }
        !           738: 
        !           739: 
        !           740: /* OleApp_HideIfNoReasonToStayVisible
        !           741: ** ----------------------------------
        !           742: **
        !           743: ** if there are no more documents visible to the user and the app
        !           744: **    itself is not under user control, then it has no reason to stay
        !           745: **    visible. we thus should hide the app. we can not directly destroy
        !           746: **    the app, because it may be validly being used programatically by
        !           747: **    another client application and should remain running. the app
        !           748: **    should simply be hidden from the user.
        !           749: */
        !           750: void OleApp_HideIfNoReasonToStayVisible(LPOLEAPP lpOleApp)
        !           751: {
        !           752:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !           753:     LPOUTLINEDOC lpOutlineDoc;
        !           754: 
        !           755:     OLEDBG_BEGIN3("OleApp_HideIfNoReasonToStayVisible\r\n")
        !           756: 
        !           757:     if (lpOleApp->m_fUserCtrl) {
        !           758:         OLEDBG_END3
        !           759:         return;     // remain visible; user in control of app
        !           760:     }
        !           761: 
        !           762:     /* Because this is an SDI app, there is only one user document.
        !           763:     ** check if it is visible to the user. an MDI app would loop over
        !           764:     ** all open MDI child documents to see if any are visible.
        !           765:     */
        !           766:     lpOutlineDoc = (LPOUTLINEDOC)lpOutlineApp->m_lpDoc;
        !           767:     if (lpOutlineDoc && IsWindowVisible(lpOutlineDoc->m_hWndDoc))
        !           768:         return;     // remain visible; the doc is visible to the user
        !           769: 
        !           770:     // if we reached here, the app should be hidden
        !           771:     OleApp_HideWindow(lpOleApp);
        !           772: 
        !           773:     OLEDBG_END3
        !           774: }
        !           775: 
        !           776: 
        !           777: /* OleApp_AddRef
        !           778: ** -------------
        !           779: **
        !           780: **  increment the ref count of the App object.
        !           781: **
        !           782: **    Returns the new ref count on the object
        !           783: */
        !           784: ULONG OleApp_AddRef(LPOLEAPP lpOleApp)
        !           785: {
        !           786:     ++lpOleApp->m_cRef;
        !           787: 
        !           788:     OleDbgOutRefCnt4(
        !           789:             "OleApp_AddRef: cRef++\r\n",
        !           790:             lpOleApp,
        !           791:             lpOleApp->m_cRef
        !           792:     );
        !           793: 
        !           794:     return lpOleApp->m_cRef;
        !           795: }
        !           796: 
        !           797: 
        !           798: /* OleApp_Release
        !           799: ** --------------
        !           800: **
        !           801: **  decrement the ref count of the App object.
        !           802: **    if the ref count goes to 0, then the app object is destroyed.
        !           803: **
        !           804: **    Returns the remaining ref count on the object
        !           805: */
        !           806: ULONG OleApp_Release (LPOLEAPP lpOleApp)
        !           807: {
        !           808:     ULONG cRef;
        !           809: 
        !           810:     OleDbgAssertSz (lpOleApp->m_cRef > 0, "Release called with cRef == 0");
        !           811: 
        !           812:     cRef = --lpOleApp->m_cRef;
        !           813: 
        !           814:     OleDbgOutRefCnt4(
        !           815:             "OleApp_AddRef: cRef--\r\n", lpOleApp, cRef);
        !           816: 
        !           817:     /*********************************************************************
        !           818:     ** OLE2NOTE: when the ClassFactory refcnt == 0, then destroy it.    **
        !           819:     **    otherwise the ClassFactory is still in use.                   **
        !           820:     *********************************************************************/
        !           821: 
        !           822:     if(cRef == 0)
        !           823:         OutlineApp_Destroy((LPOUTLINEAPP)lpOleApp);
        !           824: 
        !           825:     return cRef;
        !           826: }
        !           827: 
        !           828: 
        !           829: 
        !           830: /* OleApp_QueryInterface
        !           831: ** ---------------------
        !           832: **
        !           833: ** Retrieve a pointer to an interface on the app object.
        !           834: **
        !           835: **    OLE2NOTE: this function will AddRef the ref cnt of the object.
        !           836: **
        !           837: **    Returns NOERROR if interface is successfully retrieved.
        !           838: **            S_FALSE if the interface is not supported
        !           839: */
        !           840: HRESULT OleApp_QueryInterface (
        !           841:         LPOLEAPP                lpOleApp,
        !           842:         REFIID                  riid,
        !           843:         LPVOID FAR*             lplpvObj
        !           844: )
        !           845: {
        !           846:     SCODE sc;
        !           847: 
        !           848:     /* OLE2NOTE: we must make sure to set all out ptr parameters to NULL. */
        !           849:     *lplpvObj = NULL;
        !           850: 
        !           851:     if (IsEqualIID(riid, &IID_IUnknown)) {
        !           852:         OleDbgOut4("OleApp_QueryInterface: IUnknown* RETURNED\r\n");
        !           853: 
        !           854:         *lplpvObj = (LPVOID) &lpOleApp->m_Unknown;
        !           855:         OleApp_AddRef(lpOleApp);
        !           856:         sc = S_OK;
        !           857:     }
        !           858:     else {
        !           859:         sc = E_NOINTERFACE;
        !           860:     }
        !           861: 
        !           862:     OleDbgQueryInterfaceMethod(*lplpvObj);
        !           863:     return ResultFromScode(sc);
        !           864: }
        !           865: 
        !           866: 
        !           867: /* OleApp_RejectInComingCalls
        !           868: ** -------------------------
        !           869: **    Reject/Handle in coming OLE (LRPC) calls.
        !           870: **
        !           871: **    OLE2NOTE: if the app is in a state when it can NOT handle in
        !           872: **    coming OLE method calls from an external process (via the LRPC
        !           873: **    interprocess commnunication mechanism), then it should call
        !           874: **    OleApp_RejectInComingCalls(TRUE). in this state the
        !           875: **    IMessageFilter::HandleInComingCall method will return
        !           876: **    SERVERCALL_RETRYLATER. this tells the caller to try again in a
        !           877: **    little while. normally the calling app will put up a dialog (see
        !           878: **    OleUIBusy dialog) in this situation informing the user of the
        !           879: **    situation. the user then is normally given the option to
        !           880: **    "Switch To..." the busy application, retry, or cancel the
        !           881: **    operation. when the app is ready to continue processing such
        !           882: **    calls, it should call OleApp_RejectInComingCalls(FALSE). in this
        !           883: **    state, SERVERCALL_ISHANDLED is returned by
        !           884: **    IMessageFilter::HandleInComingCall.
        !           885: */
        !           886: void OleApp_RejectInComingCalls(LPOLEAPP lpOleApp, BOOL fReject)
        !           887: {
        !           888:     OleDbgAssert(lpOleApp->m_lpMsgFilter != NULL);
        !           889:     if (! lpOleApp->m_lpMsgFilter)
        !           890:         return;
        !           891: 
        !           892:     OleStdMsgFilter_SetInComingCallStatus(
        !           893:             lpOleApp->m_lpMsgFilter,
        !           894:             (fReject ? SERVERCALL_RETRYLATER : SERVERCALL_ISHANDLED)
        !           895:     );
        !           896: }
        !           897: 
        !           898: 
        !           899: /* OleApp_InitVtbls
        !           900:  * ----------------
        !           901:  *
        !           902:  * initialize the methods in all of the interface Vtbl's
        !           903:  *
        !           904:  * OLE2NOTE: we only need one copy of each Vtbl. When an object which
        !           905:  *      exposes an interface is instantiated, its lpVtbl is intialized
        !           906:  *      to point to the single copy of the Vtbl.
        !           907:  *
        !           908:  */
        !           909: BOOL OleApp_InitVtbls (LPOLEAPP lpOleApp)
        !           910: {
        !           911:     BOOL fStatus;
        !           912: 
        !           913:     // OleApp::IUnknown method table
        !           914:     OleStdInitVtbl(&g_OleApp_UnknownVtbl, sizeof(IUnknownVtbl));
        !           915:     g_OleApp_UnknownVtbl.QueryInterface = OleApp_Unk_QueryInterface;
        !           916:     g_OleApp_UnknownVtbl.AddRef         = OleApp_Unk_AddRef;
        !           917:     g_OleApp_UnknownVtbl.Release        = OleApp_Unk_Release;
        !           918:     fStatus = OleStdCheckVtbl(
        !           919:             &g_OleApp_UnknownVtbl,
        !           920:             sizeof(IUnknownVtbl),
        !           921:             "IUnknown"
        !           922:         );
        !           923:     if (! fStatus) return FALSE;
        !           924: 
        !           925:     // OleDoc::IUnknown method table
        !           926:     OleStdInitVtbl(&g_OleDoc_UnknownVtbl, sizeof(IUnknownVtbl));
        !           927:     g_OleDoc_UnknownVtbl.QueryInterface = OleDoc_Unk_QueryInterface;
        !           928:     g_OleDoc_UnknownVtbl.AddRef         = OleDoc_Unk_AddRef;
        !           929:     g_OleDoc_UnknownVtbl.Release        = OleDoc_Unk_Release;
        !           930:     fStatus = OleStdCheckVtbl(
        !           931:             &g_OleDoc_UnknownVtbl,
        !           932:             sizeof(IUnknownVtbl),
        !           933:             "IUnknown"
        !           934:         );
        !           935:     if (! fStatus) return FALSE;
        !           936: 
        !           937:     // OleDoc::IPersistFile method table
        !           938:     OleStdInitVtbl(&g_OleDoc_PersistFileVtbl, sizeof(IPersistFileVtbl));
        !           939:     g_OleDoc_PersistFileVtbl.QueryInterface = OleDoc_PFile_QueryInterface;
        !           940:     g_OleDoc_PersistFileVtbl.AddRef         = OleDoc_PFile_AddRef;
        !           941:     g_OleDoc_PersistFileVtbl.Release        = OleDoc_PFile_Release;
        !           942:     g_OleDoc_PersistFileVtbl.GetClassID     = OleDoc_PFile_GetClassID;
        !           943:     g_OleDoc_PersistFileVtbl.IsDirty        = OleDoc_PFile_IsDirty;
        !           944:     g_OleDoc_PersistFileVtbl.Load           = OleDoc_PFile_Load;
        !           945:     g_OleDoc_PersistFileVtbl.Save           = OleDoc_PFile_Save;
        !           946:     g_OleDoc_PersistFileVtbl.SaveCompleted  = OleDoc_PFile_SaveCompleted;
        !           947:     g_OleDoc_PersistFileVtbl.GetCurFile     = OleDoc_PFile_GetCurFile;
        !           948:     fStatus = OleStdCheckVtbl(
        !           949:             &g_OleDoc_PersistFileVtbl,
        !           950:             sizeof(IPersistFileVtbl),
        !           951:             "IPersistFile"
        !           952:         );
        !           953:     if (! fStatus) return FALSE;
        !           954: 
        !           955:     // OleDoc::IOleItemContainer method table
        !           956:     OleStdInitVtbl(&g_OleDoc_OleItemContainerVtbl, sizeof(IOleItemContainerVtbl));
        !           957:     g_OleDoc_OleItemContainerVtbl.QueryInterface =
        !           958:                                             OleDoc_ItemCont_QueryInterface;
        !           959:     g_OleDoc_OleItemContainerVtbl.AddRef    = OleDoc_ItemCont_AddRef;
        !           960:     g_OleDoc_OleItemContainerVtbl.Release   = OleDoc_ItemCont_Release;
        !           961:     g_OleDoc_OleItemContainerVtbl.ParseDisplayName  =
        !           962:                                             OleDoc_ItemCont_ParseDisplayName;
        !           963:     g_OleDoc_OleItemContainerVtbl.EnumObjects= OleDoc_ItemCont_EnumObjects;
        !           964:     g_OleDoc_OleItemContainerVtbl.LockContainer =
        !           965:                                             OleDoc_ItemCont_LockContainer;
        !           966:     g_OleDoc_OleItemContainerVtbl.GetObject = OleDoc_ItemCont_GetObject;
        !           967:     g_OleDoc_OleItemContainerVtbl.GetObjectStorage =
        !           968:                                             OleDoc_ItemCont_GetObjectStorage;
        !           969:     g_OleDoc_OleItemContainerVtbl.IsRunning = OleDoc_ItemCont_IsRunning;
        !           970:     fStatus = OleStdCheckVtbl(
        !           971:             &g_OleDoc_OleItemContainerVtbl,
        !           972:             sizeof(IOleItemContainerVtbl),
        !           973:             "IOleItemContainer"
        !           974:         );
        !           975:     if (! fStatus) return FALSE;
        !           976: 
        !           977:     // OleDoc::IDataObject method table
        !           978:     OleStdInitVtbl(&g_OleDoc_DataObjectVtbl, sizeof(IDataObjectVtbl));
        !           979:     g_OleDoc_DataObjectVtbl.QueryInterface  = OleDoc_DataObj_QueryInterface;
        !           980:     g_OleDoc_DataObjectVtbl.AddRef          = OleDoc_DataObj_AddRef;
        !           981:     g_OleDoc_DataObjectVtbl.Release         = OleDoc_DataObj_Release;
        !           982:     g_OleDoc_DataObjectVtbl.GetData         = OleDoc_DataObj_GetData;
        !           983:     g_OleDoc_DataObjectVtbl.GetDataHere     = OleDoc_DataObj_GetDataHere;
        !           984:     g_OleDoc_DataObjectVtbl.QueryGetData    = OleDoc_DataObj_QueryGetData;
        !           985:     g_OleDoc_DataObjectVtbl.GetCanonicalFormatEtc =
        !           986:                                         OleDoc_DataObj_GetCanonicalFormatEtc;
        !           987:     g_OleDoc_DataObjectVtbl.SetData         = OleDoc_DataObj_SetData;
        !           988:     g_OleDoc_DataObjectVtbl.EnumFormatEtc   = OleDoc_DataObj_EnumFormatEtc;
        !           989:     g_OleDoc_DataObjectVtbl.DAdvise          = OleDoc_DataObj_DAdvise;
        !           990:     g_OleDoc_DataObjectVtbl.DUnadvise        = OleDoc_DataObj_DUnadvise;
        !           991:     g_OleDoc_DataObjectVtbl.EnumDAdvise      = OleDoc_DataObj_EnumDAdvise;
        !           992: 
        !           993:     fStatus = OleStdCheckVtbl(
        !           994:             &g_OleDoc_DataObjectVtbl,
        !           995:             sizeof(IDataObjectVtbl),
        !           996:             "IDataObject"
        !           997:         );
        !           998:     if (! fStatus) return FALSE;
        !           999: 
        !          1000: #if defined( USE_DRAGDROP )
        !          1001: 
        !          1002:     // OleDoc::IDropTarget method table
        !          1003:     OleStdInitVtbl(&g_OleDoc_DropTargetVtbl, sizeof(IDropTargetVtbl));
        !          1004:     g_OleDoc_DropTargetVtbl.QueryInterface= OleDoc_DropTarget_QueryInterface;
        !          1005:     g_OleDoc_DropTargetVtbl.AddRef      = OleDoc_DropTarget_AddRef;
        !          1006:     g_OleDoc_DropTargetVtbl.Release     = OleDoc_DropTarget_Release;
        !          1007: 
        !          1008:     g_OleDoc_DropTargetVtbl.DragEnter   = OleDoc_DropTarget_DragEnter;
        !          1009:     g_OleDoc_DropTargetVtbl.DragOver    = OleDoc_DropTarget_DragOver;
        !          1010:     g_OleDoc_DropTargetVtbl.DragLeave   = OleDoc_DropTarget_DragLeave;
        !          1011:     g_OleDoc_DropTargetVtbl.Drop        = OleDoc_DropTarget_Drop;
        !          1012: 
        !          1013:     fStatus = OleStdCheckVtbl(
        !          1014:             &g_OleDoc_DropTargetVtbl,
        !          1015:             sizeof(IDropTargetVtbl),
        !          1016:             "IDropTarget"
        !          1017:     );
        !          1018:     if (! fStatus)
        !          1019:         return FALSE;
        !          1020: 
        !          1021:     // OleDoc::IDropSource method table
        !          1022:     OleStdInitVtbl(&g_OleDoc_DropSourceVtbl, sizeof(IDropSourceVtbl));
        !          1023:     g_OleDoc_DropSourceVtbl.QueryInterface  =
        !          1024:                                         OleDoc_DropSource_QueryInterface;
        !          1025:     g_OleDoc_DropSourceVtbl.AddRef          = OleDoc_DropSource_AddRef;
        !          1026:     g_OleDoc_DropSourceVtbl.Release         = OleDoc_DropSource_Release;
        !          1027: 
        !          1028:     g_OleDoc_DropSourceVtbl.QueryContinueDrag =
        !          1029:                                         OleDoc_DropSource_QueryContinueDrag;
        !          1030:     g_OleDoc_DropSourceVtbl.GiveFeedback    = OleDoc_DropSource_GiveFeedback;
        !          1031: 
        !          1032:     fStatus = OleStdCheckVtbl(
        !          1033:             &g_OleDoc_DropSourceVtbl,
        !          1034:             sizeof(IDropSourceVtbl),
        !          1035:             "IDropSource"
        !          1036:     );
        !          1037:     if (! fStatus) return FALSE;
        !          1038: #endif  // USE_DRAGDROP
        !          1039: 
        !          1040: #if defined( OLE_SERVER )
        !          1041: 
        !          1042:     // Initialize the server specific interface method tables.
        !          1043:     if (! ServerApp_InitVtbls((LPSERVERAPP)lpOleApp))
        !          1044:         return FALSE;
        !          1045: 
        !          1046: #elif defined( OLE_CNTR )
        !          1047: 
        !          1048:     // Initialize the container specific interface method tables.
        !          1049:     if (! ContainerApp_InitVtbls((LPCONTAINERAPP)lpOleApp))
        !          1050:         return FALSE;
        !          1051: 
        !          1052: #endif
        !          1053:     return TRUE;
        !          1054: };
        !          1055: 
        !          1056: 
        !          1057: 
        !          1058: /* OleApp_InitMenu
        !          1059:  * ---------------
        !          1060:  *
        !          1061:  *      Enable or Disable menu items depending on the state of
        !          1062:  * the appliation.
        !          1063:  * The OLE versions of the Outline sample app add a PasteSpecial command.
        !          1064:  * Also, the container version add InsertObject and ObjectVerb menu items.
        !          1065:  */
        !          1066: void OleApp_InitMenu(
        !          1067:         LPOLEAPP                lpOleApp,
        !          1068:         LPOLEDOC                lpOleDoc,
        !          1069:         HMENU                   hMenu
        !          1070: )
        !          1071: {
        !          1072:     BOOL bMsgFilterInstalled = FALSE;
        !          1073:     BOOL bRejecting = FALSE;
        !          1074:     
        !          1075:     if (!lpOleApp || !hMenu)
        !          1076:         return;
        !          1077: 
        !          1078:     OLEDBG_BEGIN3("OleApp_InitMenu\r\n")
        !          1079: 
        !          1080:     /*
        !          1081:     ** Enable/disable menu items for Message Filter
        !          1082:     */
        !          1083:     bMsgFilterInstalled = (lpOleApp->m_lpMsgFilter != NULL);
        !          1084:     bRejecting = bMsgFilterInstalled && 
        !          1085:         OleStdMsgFilter_GetInComingCallStatus(lpOleApp->m_lpMsgFilter) != SERVERCALL_ISHANDLED;
        !          1086:     
        !          1087:     CheckMenuItem(hMenu, 
        !          1088:         IDM_D_INSTALLMSGFILTER, 
        !          1089:         bMsgFilterInstalled ? MF_CHECKED : MF_UNCHECKED);
        !          1090: 
        !          1091:     EnableMenuItem(hMenu, 
        !          1092:         IDM_D_REJECTINCOMING, 
        !          1093:         bMsgFilterInstalled ? MF_ENABLED : MF_GRAYED);
        !          1094:         
        !          1095:     CheckMenuItem(hMenu, 
        !          1096:         IDM_D_REJECTINCOMING, 
        !          1097:         bRejecting ? MF_CHECKED : MF_UNCHECKED);
        !          1098: 
        !          1099: #if defined( OLE_CNTR )
        !          1100:     {
        !          1101:         LPCONTAINERDOC lpContainerDoc = (LPCONTAINERDOC)lpOleDoc;
        !          1102:         BOOL fShowObject;
        !          1103: 
        !          1104:         fShowObject = ContainerDoc_GetShowObjectFlag(lpContainerDoc);
        !          1105:         CheckMenuItem(
        !          1106:                 hMenu, 
        !          1107:                 IDM_O_SHOWOBJECT, 
        !          1108:                 (fShowObject ? MF_CHECKED : MF_UNCHECKED)
        !          1109:         );
        !          1110: 
        !          1111: #if defined( INPLACE_CNTR ) && defined( _DEBUG )
        !          1112:         CheckMenuItem(
        !          1113:                 hMenu, 
        !          1114:                 IDM_D_INSIDEOUT, 
        !          1115:                 g_fInsideOutContainer ? MF_CHECKED:MF_UNCHECKED);
        !          1116: #endif  // INPLACE_CNTR && _DEBUG 
        !          1117:                 
        !          1118:     }
        !          1119: #endif  // OLE_CNTR
        !          1120: 
        !          1121:     OLEDBG_END3
        !          1122: }
        !          1123: 
        !          1124: 
        !          1125: 
        !          1126: /* OleApp_UpdateEditMenu
        !          1127:  * ---------------------
        !          1128:  *
        !          1129:  *  Purpose:
        !          1130:  *      Update the Edit menuitems of the App according to the state of
        !          1131:  *      OutlineDoc
        !          1132:  *
        !          1133:  *  Parameter:
        !          1134:  *      lpOutlineDoc        pointer to the document
        !          1135:  *      hMenuEdit           edit menu handle
        !          1136:  */
        !          1137: void OleApp_UpdateEditMenu(
        !          1138:         LPOLEAPP                lpOleApp,
        !          1139:         LPOUTLINEDOC            lpOutlineDoc,
        !          1140:         HMENU                   hMenuEdit
        !          1141: )
        !          1142: {
        !          1143:     int nFmtEtc;
        !          1144:     UINT uEnablePaste = MF_GRAYED;
        !          1145:     UINT uEnablePasteLink = MF_GRAYED;
        !          1146:     LPDATAOBJECT lpClipboardDataObj;
        !          1147:     LPOLEDOC lpOleDoc = (LPOLEDOC)lpOutlineDoc;
        !          1148:     HRESULT hrErr;
        !          1149:     BOOL bMsgFilterInstalled = (lpOleApp->m_lpMsgFilter != NULL);
        !          1150: 
        !          1151: 
        !          1152:     if (!lpOleApp || !lpOutlineDoc || !hMenuEdit)
        !          1153:         return;
        !          1154: 
        !          1155:     if (!OleDoc_GetUpdateEditMenuFlag(lpOleDoc))
        !          1156:         /* OLE2NOTE: if the flag is not set, we don't have to update
        !          1157:         **    the edit menu again. This blocks repetitive updating when
        !          1158:         **    the user move the mouse across Edit menu while holding
        !          1159:         **    down the button 
        !          1160:         */
        !          1161:         return;
        !          1162: 
        !          1163:     OLEDBG_BEGIN3("OleApp_InitEditMenu\r\n")
        !          1164: 
        !          1165:     /* OLE2NOTE: we do not want to ever give the busy dialog when we
        !          1166:     **    are trying to put up our menus. eg. even if the source of
        !          1167:     **    data on the clipboard is busy, we do not want put up the busy
        !          1168:     **    dialog. thus we will disable the dialog and at the end
        !          1169:     **    re-enable it.
        !          1170:     */
        !          1171:     if (bMsgFilterInstalled)
        !          1172:         OleStdMsgFilter_EnableBusyDialog(lpOleApp->m_lpMsgFilter, FALSE);
        !          1173: 
        !          1174:     // check if there is data on the clipboard that we can paste/paste link
        !          1175: 
        !          1176:     OLEDBG_BEGIN2("OleGetClipboard called\r\n")
        !          1177:     hrErr = OleGetClipboard((LPDATAOBJECT FAR*)&lpClipboardDataObj);
        !          1178:     OLEDBG_END2
        !          1179: 
        !          1180:     if (hrErr == NOERROR) {
        !          1181:         nFmtEtc = OleStdGetPriorityClipboardFormat(
        !          1182:                 lpClipboardDataObj,
        !          1183:                 lpOleApp->m_arrPasteEntries,
        !          1184:                 lpOleApp->m_nPasteEntries
        !          1185:         );
        !          1186: 
        !          1187:         if (nFmtEtc >= 0)
        !          1188:             uEnablePaste = MF_ENABLED;  // there IS a format we like
        !          1189: 
        !          1190:         OLEDBG_BEGIN2("OleQueryLinkFromData called\r\n")
        !          1191:         hrErr = OleQueryLinkFromData(lpClipboardDataObj);
        !          1192:         OLEDBG_END2
        !          1193: 
        !          1194:         if(hrErr == NOERROR)
        !          1195:             uEnablePasteLink = MF_ENABLED;
        !          1196: 
        !          1197:         OleStdRelease((LPUNKNOWN)lpClipboardDataObj);
        !          1198:     }
        !          1199: 
        !          1200:     EnableMenuItem(hMenuEdit, IDM_E_PASTE, uEnablePaste);
        !          1201:     EnableMenuItem(hMenuEdit, IDM_E_PASTESPECIAL, uEnablePaste);
        !          1202:     
        !          1203:       
        !          1204: #if defined( OLE_CNTR ) 
        !          1205:        if (ContainerDoc_GetNextLink((LPCONTAINERDOC)lpOutlineDoc, NULL))
        !          1206:                EnableMenuItem(hMenuEdit, IDM_E_EDITLINKS, MF_ENABLED);
        !          1207:        else
        !          1208:                EnableMenuItem(hMenuEdit, IDM_E_EDITLINKS, MF_GRAYED);
        !          1209:        
        !          1210:        
        !          1211:     {
        !          1212:         LPCONTAINERAPP  lpContainerApp = (LPCONTAINERAPP)lpOleApp;
        !          1213:         HMENU           hMenuVerb = NULL;
        !          1214:         LPLINELIST      lpLL = OutlineDoc_GetLineList(lpOutlineDoc);
        !          1215:         int             nIndex = LineList_GetFocusLineIndex(lpLL);
        !          1216:         LPLINE          lpLine = LineList_GetLine(lpLL, nIndex);
        !          1217:         LPOLEOBJECT     lpOleObj = NULL;
        !          1218:         LPCONTAINERLINE lpContainerLine = NULL;
        !          1219:         BOOL            fSelIsOleObject;
        !          1220: 
        !          1221:         EnableMenuItem(hMenuEdit, IDM_E_PASTELINK, uEnablePasteLink);
        !          1222: 
        !          1223:         /* check if selection is a single line that contains an OleObject */
        !          1224: 
        !          1225:         fSelIsOleObject = ContainerDoc_IsSelAnOleObject(
        !          1226:                 (LPCONTAINERDOC)lpOutlineDoc,
        !          1227:                 &IID_IOleObject,
        !          1228:                 (LPUNKNOWN FAR*)&lpOleObj,
        !          1229:                 NULL,    /* we don't need the line index */
        !          1230:                 (LPCONTAINERLINE FAR*)&lpContainerLine
        !          1231:         );
        !          1232: 
        !          1233:         if (hMenuEdit != NULL) {
        !          1234: 
        !          1235:             /* If the current line is an ContainerLine, add the object
        !          1236:             **    verb sub menu to the Edit menu. if the line is not an
        !          1237:             **    ContainerLine, (lpOleObj==NULL) then disable the
        !          1238:             **    Edit.Object command. this helper API takes care of
        !          1239:             **    building the verb menu as appropriate.
        !          1240:             */
        !          1241:             OleUIAddVerbMenu(
        !          1242:                     (LPOLEOBJECT)lpOleObj,
        !          1243:                     (lpContainerLine ? lpContainerLine->m_lpszShortType:NULL),
        !          1244:                     hMenuEdit,
        !          1245:                     POS_OBJECT,
        !          1246:                     IDM_E_OBJECTVERBMIN,
        !          1247:                     TRUE,                  // Add Convert menu item
        !          1248:                     IDM_E_CONVERTVERB,     // ID for Convert menu item
        !          1249:                     (HMENU FAR*) &hMenuVerb
        !          1250:             );
        !          1251: 
        !          1252: #if defined( USE_STATUSBAR_LATER )
        !          1253:             /* setup status messages for the object verb menu */
        !          1254:             if (hMenuVerb) {
        !          1255:                 // REVIEW: this string should come from a string resource.
        !          1256:                 // REVIEW: this doesn't work for dynamically created menus
        !          1257:                 AssignPopupMessage(
        !          1258:                         hMenuVerb,
        !          1259:                         "Open, edit or interact with an object"
        !          1260:                 );
        !          1261:             }
        !          1262: #endif  // USE_STATUSBAR_LATER
        !          1263:         }
        !          1264: 
        !          1265:         if (lpOleObj)
        !          1266:             OleStdRelease((LPUNKNOWN)lpOleObj);
        !          1267:     }
        !          1268: 
        !          1269: #endif  // OLE_CNTR
        !          1270: 
        !          1271:     // re-enable the busy dialog
        !          1272:     if (bMsgFilterInstalled)
        !          1273:         OleStdMsgFilter_EnableBusyDialog(lpOleApp->m_lpMsgFilter, TRUE);
        !          1274: 
        !          1275:     OleDoc_SetUpdateEditMenuFlag(lpOleDoc, FALSE);
        !          1276:     
        !          1277:     OLEDBG_END3
        !          1278: }
        !          1279: 
        !          1280: 
        !          1281: /* OleApp_RegisterClassFactory
        !          1282:  * ---------------------------
        !          1283:  *
        !          1284:  * Register our app's ClassFactory with OLE.
        !          1285:  *
        !          1286:  */
        !          1287: BOOL OleApp_RegisterClassFactory(LPOLEAPP lpOleApp)
        !          1288: {
        !          1289:     HRESULT hrErr;
        !          1290: 
        !          1291:     if (lpOleApp->m_lpClassFactory) 
        !          1292:         return TRUE;    // already registered
        !          1293: 
        !          1294:     OLEDBG_BEGIN3("OleApp_RegisterClassFactory\r\n")
        !          1295: 
        !          1296:     /******************************************************************
        !          1297:     ** An SDI app must register its ClassFactory if it is launched
        !          1298:     **    for embedding (/Embedding command line option specified).
        !          1299:     ** An MDI app must register its ClassFactory in all cases,
        !          1300:     ******************************************************************/
        !          1301:     
        !          1302:     lpOleApp->m_lpClassFactory = AppClassFactory_Create();
        !          1303:     if (! lpOleApp->m_lpClassFactory) {
        !          1304:         OutlineApp_ErrorMessage(g_lpApp, ErrMsgCreateCF);
        !          1305:         goto error;
        !          1306:     }
        !          1307: 
        !          1308:     OLEDBG_BEGIN2("CoRegisterClassObject called\r\n")
        !          1309:     hrErr = CoRegisterClassObject(
        !          1310:                 &CLSID_APP,
        !          1311:                 (LPUNKNOWN)lpOleApp->m_lpClassFactory,
        !          1312:                 CLSCTX_LOCAL_SERVER,
        !          1313:                 REGCLS_SINGLEUSE,
        !          1314:                 &lpOleApp->m_dwRegClassFac
        !          1315:     );
        !          1316:     OLEDBG_END2
        !          1317: 
        !          1318:     if(hrErr != NOERROR) {
        !          1319:         OleDbgOutHResult("CoRegisterClassObject returned", hrErr);
        !          1320:         OutlineApp_ErrorMessage(g_lpApp, ErrMsgRegCF);
        !          1321:         goto error;
        !          1322:     }
        !          1323: 
        !          1324:     OLEDBG_END3
        !          1325:     return TRUE;
        !          1326: 
        !          1327: error:
        !          1328: 
        !          1329:     if (lpOleApp->m_lpClassFactory) {
        !          1330:         OleStdRelease((LPUNKNOWN)lpOleApp->m_lpClassFactory);
        !          1331:         lpOleApp->m_lpClassFactory = NULL;
        !          1332:     }
        !          1333:     OLEDBG_END3
        !          1334:     return FALSE;
        !          1335: }
        !          1336: 
        !          1337: 
        !          1338: /* OleApp_RevokeClassFactory
        !          1339:  * -------------------------
        !          1340:  *
        !          1341:  * Revoke our app's ClassFactory.
        !          1342:  *
        !          1343:  */
        !          1344: void OleApp_RevokeClassFactory(LPOLEAPP lpOleApp)
        !          1345: {
        !          1346:     HRESULT hrErr;
        !          1347: 
        !          1348:     if (lpOleApp->m_lpClassFactory) {
        !          1349: 
        !          1350:         OLEDBG_BEGIN2("CoRevokeClassObject called\r\n")
        !          1351:         hrErr = CoRevokeClassObject(lpOleApp->m_dwRegClassFac);
        !          1352:         OLEDBG_END2
        !          1353:         if (hrErr != NOERROR) {
        !          1354:             OleDbgOutHResult("CoRevokeClassObject returned", hrErr);
        !          1355:         }
        !          1356: 
        !          1357:         OleStdVerifyRelease(
        !          1358:                 (LPUNKNOWN)lpOleApp->m_lpClassFactory,
        !          1359:                 "ClassFactory NOT released properly!"
        !          1360:         );
        !          1361:         lpOleApp->m_lpClassFactory = NULL;
        !          1362:     }
        !          1363: }
        !          1364: 
        !          1365: 
        !          1366: #if defined( USE_MSGFILTER )
        !          1367: 
        !          1368: /* OleApp_RegisterMessageFilter
        !          1369:  * ----------------------------
        !          1370:  *  Register our IMessageFilter*. the message filter is used to handle 
        !          1371:  *  concurrency. we will use a standard implementation of IMessageFilter 
        !          1372:  *  that is included as part of the OLE2UI library.
        !          1373:  */
        !          1374: BOOL OleApp_RegisterMessageFilter(LPOLEAPP lpOleApp)
        !          1375: {
        !          1376:     HRESULT hrErr;
        !          1377:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !          1378: 
        !          1379:     if (lpOleApp->m_lpMsgFilter == NULL) {
        !          1380:         // Register our message filter.             
        !          1381:         lpOleApp->m_lpfnMsgPending = (MSGPENDINGPROC)MessagePendingProc;
        !          1382:         lpOleApp->m_lpMsgFilter = OleStdMsgFilter_Create(
        !          1383:                 g_lpApp->m_hWndApp,
        !          1384:                 (LPSTR)APPNAME,
        !          1385:                 lpOleApp->m_lpfnMsgPending
        !          1386:         );
        !          1387:     
        !          1388:         OLEDBG_BEGIN2("CoRegisterMessageFilter called\r\n")
        !          1389:         hrErr = CoRegisterMessageFilter(
        !          1390:                     lpOleApp->m_lpMsgFilter,
        !          1391:                     NULL    /* don't need previous message filter */
        !          1392:         );
        !          1393:         OLEDBG_END2
        !          1394:     
        !          1395:         if(hrErr != NOERROR) {
        !          1396:             OutlineApp_ErrorMessage(lpOutlineApp, ErrMsgRegMF);
        !          1397:             return FALSE;
        !          1398:         }    
        !          1399:     }
        !          1400:     return TRUE;
        !          1401: }
        !          1402: 
        !          1403: 
        !          1404: /* OleApp_RevokeMessageFilter
        !          1405:  * --------------------------
        !          1406:  *  Revoke our IMessageFilter*. the message filter is used to handle 
        !          1407:  *  concurrency. we will use a standard implementation of IMessageFilter 
        !          1408:  *  that is included as part of the OLE2UI library.
        !          1409:  */
        !          1410: void OleApp_RevokeMessageFilter(LPOLEAPP lpOleApp)
        !          1411: {
        !          1412:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
        !          1413: 
        !          1414:     if (lpOleApp->m_lpMsgFilter != NULL) {
        !          1415:         // Revoke our message filter
        !          1416:         OLEDBG_BEGIN2("CoRegisterMessageFilter(NULL) called\r\n")
        !          1417:         CoRegisterMessageFilter(NULL, NULL);
        !          1418:         OLEDBG_END2
        !          1419:         
        !          1420:         if (lpOleApp->m_lpfnMsgPending) {
        !          1421:             lpOleApp->m_lpfnMsgPending = NULL;
        !          1422:         }
        !          1423:             
        !          1424:         OleStdVerifyRelease(
        !          1425:                 (LPUNKNOWN)lpOleApp->m_lpMsgFilter,
        !          1426:                 "Release MessageFilter FAILED!"
        !          1427:         );
        !          1428:         lpOleApp->m_lpMsgFilter = NULL;
        !          1429:     }
        !          1430: }
        !          1431: 
        !          1432: 
        !          1433: /* MessagePendingProc
        !          1434:  * ------------------
        !          1435:  *
        !          1436:  * Callback function for the IMessageFilter::MessagePending procedure.  This
        !          1437:  * function is called when a message is received by our application while
        !          1438:  * we are waiting for an OLE call to complete.  We are essentially
        !          1439:  * blocked at this point, waiting for a response from the other OLE application.
        !          1440:  * We should not process any messages which might cause another OLE call 
        !          1441:  * to become blocked, or any other call which might cause re-entrancy problems.
        !          1442:  *
        !          1443:  * For this application, only process WM_PAINT messages.  A more sophisticated
        !          1444:  * application might allow certain menu messages and menu items to be processed
        !          1445:  * also.
        !          1446:  *
        !          1447:  * RETURNS: TRUE if we processed the message, FALSE if we did not.
        !          1448:  */
        !          1449:  
        !          1450: BOOL FAR PASCAL EXPORT MessagePendingProc(MSG FAR *lpMsg)
        !          1451: {
        !          1452:     BOOL fMsgDispatched = FALSE;
        !          1453: 
        !          1454:     // Our application is only handling WM_PAINT messages when we are blocked
        !          1455:     switch (lpMsg->message) {
        !          1456:         case WM_PAINT:
        !          1457: 
        !          1458:             OleDbgOut2("WM_PAINT dispatched while blocked\r\n");
        !          1459: 
        !          1460:             DispatchMessage(lpMsg);
        !          1461: 
        !          1462:             fMsgDispatched = TRUE;
        !          1463:             break;
        !          1464:     }
        !          1465: 
        !          1466:     return fMsgDispatched;
        !          1467: }
        !          1468: #endif  // USE_MSGFILTER
        !          1469: 
        !          1470: 
        !          1471: /* OleApp_FlushClipboard
        !          1472:  * ---------------------
        !          1473:  *
        !          1474:  *  Force the Windows clipboard to release our clipboard DataObject.
        !          1475:  */
        !          1476: void OleApp_FlushClipboard(LPOLEAPP lpOleApp)
        !          1477: {
        !          1478:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !          1479:     LPOLEDOC lpClipboardDoc = (LPOLEDOC)lpOutlineApp->m_lpClipboardDoc;
        !          1480: 
        !          1481:     OLEDBG_BEGIN3("OleApp_FlushClipboard\r\n")
        !          1482: 
        !          1483:     /* OLE2NOTE: if for some reason our clipboard data transfer
        !          1484:     **    document is still held on to by an external client, we want
        !          1485:     **    to forceably break all external connections.
        !          1486:     */
        !          1487:     OLEDBG_BEGIN2("CoDisconnectObject called\r\n")
        !          1488:     CoDisconnectObject((LPUNKNOWN)&lpClipboardDoc->m_Unknown, 0);
        !          1489:     OLEDBG_END2
        !          1490: 
        !          1491:     OLEDBG_BEGIN2("OleFlushClipboard called\r\n")
        !          1492:     OleFlushClipboard();
        !          1493:     OLEDBG_END2
        !          1494: 
        !          1495:     lpOutlineApp->m_lpClipboardDoc = NULL;
        !          1496: 
        !          1497:     OLEDBG_END3
        !          1498: }
        !          1499: 
        !          1500: 
        !          1501: /* OleApp_NewCommand
        !          1502:  * -----------------
        !          1503:  *
        !          1504:  *  Start a new untitled document (File.New command).
        !          1505:  */
        !          1506: void OleApp_NewCommand(LPOLEAPP lpOleApp)
        !          1507: {
        !          1508:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !          1509:     LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
        !          1510: 
        !          1511:     if (! OutlineDoc_Close(lpOutlineDoc, OLECLOSE_PROMPTSAVE)) {
        !          1512:         return;
        !          1513:     }
        !          1514: 
        !          1515:     OleDbgAssertSz(lpOutlineApp->m_lpDoc==NULL,"Closed doc NOT properly destroyed");
        !          1516: 
        !          1517:     lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !          1518:     if (! lpOutlineApp->m_lpDoc) goto error;
        !          1519: 
        !          1520:     /* OLE2NOTE: initially the Doc object is created with a 0 ref
        !          1521:     **    count. in order to have a stable Doc object during the
        !          1522:     **    process of initializing the new Doc instance,
        !          1523:     **    we intially AddRef the Doc ref cnt and later
        !          1524:     **    Release it. This initial AddRef is artificial; it is simply
        !          1525:     **    done to guarantee that a harmless QueryInterface followed by
        !          1526:     **    a Release does not inadvertantly force our object to destroy
        !          1527:     **    itself prematurely.
        !          1528:     */
        !          1529:     OleDoc_AddRef((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !          1530: 
        !          1531:     // set the doc to an (Untitled) doc.
        !          1532:     if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
        !          1533:         goto error;
        !          1534: 
        !          1535:     // position and size the new doc window
        !          1536:     OutlineApp_ResizeWindows(lpOutlineApp);
        !          1537:     OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc); // calls OleDoc_Lock
        !          1538: 
        !          1539:     OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc);  // rel artificial AddRef
        !          1540: 
        !          1541:     return;
        !          1542: 
        !          1543: error:
        !          1544:     // REVIEW: should load string from string resource
        !          1545:     OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
        !          1546: 
        !          1547:     if (lpOutlineApp->m_lpDoc) {
        !          1548:         // releasing the artificial AddRef above will destroy the document
        !          1549:         OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !          1550:         lpOutlineApp->m_lpDoc = NULL;
        !          1551:     }
        !          1552: 
        !          1553:     return;
        !          1554: }
        !          1555: 
        !          1556: 
        !          1557: /* OleApp_OpenCommand
        !          1558:  * ------------------
        !          1559:  *
        !          1560:  *  Load a document from file (File.Open command).
        !          1561:  */
        !          1562: void OleApp_OpenCommand(LPOLEAPP lpOleApp)
        !          1563: {
        !          1564:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpOleApp;
        !          1565:     LPOUTLINEDOC lpOutlineDoc = lpOutlineApp->m_lpDoc;
        !          1566:     OPENFILENAME ofn;
        !          1567:     char szFilter[]=APPFILENAMEFILTER;
        !          1568:     char szFileName[256];
        !          1569:     UINT i;
        !          1570:     BOOL fStatus = TRUE;
        !          1571: 
        !          1572:     if (! OutlineDoc_CheckSaveChanges(lpOutlineDoc, OLECLOSE_PROMPTSAVE))
        !          1573:         return;           // abort opening new doc
        !          1574: 
        !          1575:     for(i=0; szFilter[i]; i++)
        !          1576:         if(szFilter[i]=='|') szFilter[i]='\0';
        !          1577: 
        !          1578:     _fmemset((LPOPENFILENAME)&ofn,0,sizeof(OPENFILENAME));
        !          1579: 
        !          1580:     szFileName[0]='\0';
        !          1581: 
        !          1582:     ofn.lStructSize=sizeof(OPENFILENAME);
        !          1583:     ofn.hwndOwner=lpOutlineApp->m_hWndApp;
        !          1584:     ofn.lpstrFilter=(LPSTR)szFilter;
        !          1585:     ofn.lpstrFile=(LPSTR)szFileName;
        !          1586:     ofn.nMaxFile=sizeof(szFileName);
        !          1587:     ofn.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
        !          1588:     ofn.lpstrDefExt=DEFEXTENSION;
        !          1589: 
        !          1590:     if(! GetOpenFileName((LPOPENFILENAME)&ofn)) 
        !          1591:         return;         // user canceled file open dialog
        !          1592: 
        !          1593:     OutlineDoc_Close(lpOutlineDoc, OLECLOSE_NOSAVE);
        !          1594:     OleDbgAssertSz(
        !          1595:             lpOutlineApp->m_lpDoc==NULL,"Closed doc NOT properly destroyed");
        !          1596: 
        !          1597:     lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !          1598:     if (! lpOutlineApp->m_lpDoc) goto error;
        !          1599: 
        !          1600:     /* OLE2NOTE: initially the Doc object is created with a 0 ref
        !          1601:     **    count. in order to have a stable Doc object during the
        !          1602:     **    process of initializing the new Doc instance,
        !          1603:     **    we intially AddRef the Doc ref cnt and later
        !          1604:     **    Release it. This initial AddRef is artificial; it is simply
        !          1605:     **    done to guarantee that a harmless QueryInterface followed by
        !          1606:     **    a Release does not inadvertantly force our object to destroy
        !          1607:     **    itself prematurely.
        !          1608:     */
        !          1609:     OleDoc_AddRef((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !          1610: 
        !          1611:     fStatus=OutlineDoc_LoadFromFile(lpOutlineApp->m_lpDoc, (LPSTR)szFileName);
        !          1612: 
        !          1613:     if (! fStatus) {
        !          1614:         // loading the doc failed; create an untitled instead
        !          1615: 
        !          1616:         // releasing the artificial AddRef above will destroy the document
        !          1617:         OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !          1618: 
        !          1619:         lpOutlineApp->m_lpDoc = OutlineApp_CreateDoc(lpOutlineApp, FALSE);
        !          1620:         if (! lpOutlineApp->m_lpDoc) goto error;
        !          1621:         OleDoc_AddRef((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !          1622: 
        !          1623:         if (! OutlineDoc_InitNewFile(lpOutlineApp->m_lpDoc))
        !          1624:             goto error;
        !          1625:     }
        !          1626: 
        !          1627:     // position and size the new doc window
        !          1628:     OutlineApp_ResizeWindows(lpOutlineApp);
        !          1629:     OutlineDoc_ShowWindow(lpOutlineApp->m_lpDoc);
        !          1630: 
        !          1631: #if defined( OLE_CNTR )
        !          1632:        UpdateWindow(lpOutlineApp->m_hWndApp);
        !          1633:        ContainerDoc_UpdateLinks((LPCONTAINERDOC)lpOutlineApp->m_lpDoc);
        !          1634: #endif 
        !          1635:        
        !          1636:     OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc);  // rel artificial AddRef
        !          1637: 
        !          1638:     return;
        !          1639: 
        !          1640: error:
        !          1641:     // REVIEW: should load string from string resource
        !          1642:     OutlineApp_ErrorMessage(lpOutlineApp, "Could not create new document");
        !          1643: 
        !          1644:     if (lpOutlineApp->m_lpDoc) {
        !          1645:         // releasing the artificial AddRef above will destroy the document
        !          1646:         OleDoc_Release((LPOLEDOC)lpOutlineApp->m_lpDoc);
        !          1647:         lpOutlineApp->m_lpDoc = NULL;
        !          1648:     }
        !          1649: 
        !          1650:     return;
        !          1651: }
        !          1652: 
        !          1653: 
        !          1654: /*************************************************************************
        !          1655: ** OleApp::IUnknown interface implementation
        !          1656: *************************************************************************/
        !          1657: 
        !          1658: STDMETHODIMP OleApp_Unk_QueryInterface(
        !          1659:         LPUNKNOWN           lpThis,
        !          1660:         REFIID              riid,
        !          1661:         LPVOID FAR*         lplpvObj
        !          1662: )
        !          1663: {
        !          1664:     LPOLEAPP lpOleApp = ((struct CAppUnknownImpl FAR*)lpThis)->lpOleApp;
        !          1665: 
        !          1666:     return OleApp_QueryInterface(lpOleApp, riid, lplpvObj);
        !          1667: }
        !          1668: 
        !          1669: 
        !          1670: STDMETHODIMP_(ULONG) OleApp_Unk_AddRef(LPUNKNOWN lpThis)
        !          1671: {
        !          1672:     LPOLEAPP lpOleApp = ((struct CAppUnknownImpl FAR*)lpThis)->lpOleApp;
        !          1673: 
        !          1674:     OleDbgAddRefMethod(lpThis, "IUnknown");
        !          1675: 
        !          1676:     return OleApp_AddRef(lpOleApp);
        !          1677: }
        !          1678: 
        !          1679: 
        !          1680: STDMETHODIMP_(ULONG) OleApp_Unk_Release (LPUNKNOWN lpThis)
        !          1681: {
        !          1682:     LPOLEAPP lpOleApp = ((struct CAppUnknownImpl FAR*)lpThis)->lpOleApp;
        !          1683: 
        !          1684:     OleDbgReleaseMethod(lpThis, "IUnknown");
        !          1685: 
        !          1686:     return OleApp_Release(lpOleApp);
        !          1687: }
        !          1688: 
        !          1689: 
        !          1690: 
        !          1691: #if defined( OLE_SERVER )
        !          1692: 
        !          1693: /*************************************************************************
        !          1694: ** ServerDoc Supprt Functions Used by Server versions
        !          1695: *************************************************************************/
        !          1696: 
        !          1697: /* ServerApp_InitInstance
        !          1698:  * ----------------------
        !          1699:  *
        !          1700:  * Initialize the app instance by creating the main frame window and 
        !          1701:  * performing app instance specific initializations 
        !          1702:  *  (eg. initializing interface Vtbls).
        !          1703:  * 
        !          1704:  * RETURNS: TRUE if the memory could be allocated, and the server app
        !          1705:  *               was properly initialized.
        !          1706:  *          FALSE otherwise
        !          1707:  *
        !          1708:  */
        !          1709: 
        !          1710: BOOL ServerApp_InitInstance(
        !          1711:         LPSERVERAPP             lpServerApp, 
        !          1712:         HINSTANCE               hInst, 
        !          1713:         int                     nCmdShow
        !          1714: )
        !          1715: {
        !          1716:     LPOLEAPP lpOleApp = (LPOLEAPP)lpServerApp;
        !          1717:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpServerApp;
        !          1718: 
        !          1719:     /* Setup arrays used by IDataObject::EnumFormatEtc.
        !          1720:     **
        !          1721:     ** OLE2NOTE: The order that the formats are listed for GetData is very
        !          1722:     **    significant. It should be listed in order of highest fidelity
        !          1723:     **    formats to least fidelity formats. A common ordering will be:
        !          1724:     **                  1. private app formats
        !          1725:     **                  2. EmbedSource
        !          1726:     **                  3. lower fidelity interchange formats
        !          1727:     **                  4. pictures (metafile, dib, etc.)
        !          1728:     **                      (graphic-related apps offer pictures 1st!)
        !          1729:     **                  5. LinkSource
        !          1730:     */
        !          1731: 
        !          1732:     /* m_arrDocGetFmts array enumerates the formats that a ServerDoc
        !          1733:     **    DataTransferDoc object can offer (give) through a
        !          1734:     **    IDataObject::GetData call. a ServerDoc DataTransferDoc offers
        !          1735:     **    data formats in the following order: 
        !          1736:     **                  1. CF_OUTLINE
        !          1737:     **                  2. CF_EMBEDSOURCE
        !          1738:     **                  3. CF_OBJECTDESCRIPTOR
        !          1739:     **                  4. CF_TEXT
        !          1740:     **                  5. CF_METAFILEPICT
        !          1741:     **                  6. CF_LINKSOURCE *
        !          1742:     **                  7. CF_LINKSRCDESCRIPTOR *
        !          1743:     **    
        !          1744:     **    * NOTE: CF_LINKSOURCE and CF_LINKSRCDESCRIPTOR is only
        !          1745:     **    offered if the doc is able to give 
        !          1746:     **    a Moniker which references the data. CF_LINKSOURCE is
        !          1747:     **    deliberately listed last in this array of possible formats.
        !          1748:     **    if the doc does not have a Moniker then the last element of
        !          1749:     **    this array is not used. (see SvrDoc_DataObj_EnumFormatEtc).
        !          1750:     **    
        !          1751:     **    NOTE: The list of formats that a USER ServerDoc document can
        !          1752:     **    offer is a static list and is registered in the registration
        !          1753:     **    database for the SVROUTL class. The
        !          1754:     **    IDataObject::EnumFormatEtc method returns OLE_S_USEREG in the
        !          1755:     **    case the document is a user docuemt (ie. created via
        !          1756:     **    File.New, File.Open, InsertObject in a container, or
        !          1757:     **    IPersistFile::Load during binding a link source). this tells
        !          1758:     **    OLE to enumerate the formats automatically using the data the
        !          1759:     **    the REGDB.
        !          1760:     */
        !          1761: 
        !          1762:     lpOleApp->m_arrDocGetFmts[0].cfFormat   = lpOutlineApp->m_cfOutline;
        !          1763:     lpOleApp->m_arrDocGetFmts[0].ptd        = NULL;
        !          1764:     lpOleApp->m_arrDocGetFmts[0].dwAspect   = DVASPECT_CONTENT;
        !          1765:     lpOleApp->m_arrDocGetFmts[0].tymed      = TYMED_HGLOBAL;
        !          1766:     lpOleApp->m_arrDocGetFmts[0].lindex     = -1;
        !          1767: 
        !          1768:     lpOleApp->m_arrDocGetFmts[1].cfFormat   = lpOleApp->m_cfEmbedSource;
        !          1769:     lpOleApp->m_arrDocGetFmts[1].ptd        = NULL;
        !          1770:     lpOleApp->m_arrDocGetFmts[1].dwAspect   = DVASPECT_CONTENT;
        !          1771:     lpOleApp->m_arrDocGetFmts[1].tymed      = TYMED_ISTORAGE;
        !          1772:     lpOleApp->m_arrDocGetFmts[1].lindex     = -1;
        !          1773: 
        !          1774:     lpOleApp->m_arrDocGetFmts[2].cfFormat   = CF_TEXT;
        !          1775:     lpOleApp->m_arrDocGetFmts[2].ptd        = NULL;
        !          1776:     lpOleApp->m_arrDocGetFmts[2].dwAspect   = DVASPECT_CONTENT;
        !          1777:     lpOleApp->m_arrDocGetFmts[2].tymed      = TYMED_HGLOBAL;
        !          1778:     lpOleApp->m_arrDocGetFmts[2].lindex     = -1;
        !          1779: 
        !          1780:     lpOleApp->m_arrDocGetFmts[3].cfFormat   = CF_METAFILEPICT;
        !          1781:     lpOleApp->m_arrDocGetFmts[3].ptd        = NULL;
        !          1782:     lpOleApp->m_arrDocGetFmts[3].dwAspect   = DVASPECT_CONTENT;
        !          1783:     lpOleApp->m_arrDocGetFmts[3].tymed      = TYMED_MFPICT;
        !          1784:     lpOleApp->m_arrDocGetFmts[3].lindex     = -1;
        !          1785: 
        !          1786:     lpOleApp->m_arrDocGetFmts[4].cfFormat   = lpOleApp->m_cfObjectDescriptor;
        !          1787:     lpOleApp->m_arrDocGetFmts[4].ptd        = NULL;
        !          1788:     lpOleApp->m_arrDocGetFmts[4].dwAspect   = DVASPECT_CONTENT;
        !          1789:     lpOleApp->m_arrDocGetFmts[4].tymed      = TYMED_HGLOBAL;
        !          1790:     lpOleApp->m_arrDocGetFmts[4].lindex     = -1;
        !          1791: 
        !          1792:     lpOleApp->m_arrDocGetFmts[5].cfFormat   = lpOleApp->m_cfLinkSource;
        !          1793:     lpOleApp->m_arrDocGetFmts[5].ptd        = NULL;
        !          1794:     lpOleApp->m_arrDocGetFmts[5].dwAspect   = DVASPECT_CONTENT;
        !          1795:     lpOleApp->m_arrDocGetFmts[5].tymed      = TYMED_ISTREAM;
        !          1796:     lpOleApp->m_arrDocGetFmts[5].lindex     = -1;
        !          1797: 
        !          1798:     lpOleApp->m_arrDocGetFmts[6].cfFormat   = lpOleApp->m_cfLinkSrcDescriptor;
        !          1799:     lpOleApp->m_arrDocGetFmts[6].ptd        = NULL;
        !          1800:     lpOleApp->m_arrDocGetFmts[6].dwAspect   = DVASPECT_CONTENT;
        !          1801:     lpOleApp->m_arrDocGetFmts[6].tymed      = TYMED_HGLOBAL;
        !          1802:     lpOleApp->m_arrDocGetFmts[6].lindex     = -1;
        !          1803:     
        !          1804:     lpOleApp->m_nDocGetFmts = 7;
        !          1805:         
        !          1806:     /* m_arrPasteEntries array enumerates the formats that a ServerDoc
        !          1807:     **    object can accept (get) from the clipboard.
        !          1808:     **    The formats are listed in priority order.
        !          1809:     **    ServerDoc accept data formats in the following order:
        !          1810:     **                  1. CF_OUTLINE
        !          1811:     **                  2. CF_TEXT
        !          1812:     */
        !          1813:     // REVIEW: strings should be loaded from string resource
        !          1814:     lpOleApp->m_arrPasteEntries[0].fmtetc.cfFormat =lpOutlineApp->m_cfOutline;
        !          1815:     lpOleApp->m_arrPasteEntries[0].fmtetc.ptd      = NULL;
        !          1816:     lpOleApp->m_arrPasteEntries[0].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          1817:     lpOleApp->m_arrPasteEntries[0].fmtetc.tymed    = TYMED_HGLOBAL;
        !          1818:     lpOleApp->m_arrPasteEntries[0].fmtetc.lindex   = -1;
        !          1819:     lpOleApp->m_arrPasteEntries[0].lpstrFormatName = "Outline Data";
        !          1820:     lpOleApp->m_arrPasteEntries[0].lpstrResultText = "as Outline Data";
        !          1821:     lpOleApp->m_arrPasteEntries[0].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          1822: 
        !          1823:     lpOleApp->m_arrPasteEntries[1].fmtetc.cfFormat = CF_TEXT;
        !          1824:     lpOleApp->m_arrPasteEntries[1].fmtetc.ptd      = NULL;
        !          1825:     lpOleApp->m_arrPasteEntries[1].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          1826:     lpOleApp->m_arrPasteEntries[1].fmtetc.tymed    = TYMED_HGLOBAL;
        !          1827:     lpOleApp->m_arrPasteEntries[1].fmtetc.lindex   = -1;
        !          1828:     lpOleApp->m_arrPasteEntries[1].lpstrFormatName = "Text";
        !          1829:     lpOleApp->m_arrPasteEntries[1].lpstrResultText = "as text";
        !          1830:     lpOleApp->m_arrPasteEntries[1].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          1831:     
        !          1832:     lpOleApp->m_nPasteEntries = 2;
        !          1833: 
        !          1834:    /**    m_arrLinkTypes array enumerates the link types that a ServerDoc
        !          1835:     **    object can accept from the clipboard. ServerDoc does NOT
        !          1836:     **    accept any type of link from the clipboard. ServerDoc can
        !          1837:     **    only be the source of a link. it can not contain links.
        !          1838:     */
        !          1839:     
        !          1840:     lpOleApp->m_nLinkTypes = 0;
        !          1841: 
        !          1842: #if defined( INPLACE_SVR )
        !          1843: 
        !          1844:     lpServerApp->m_hAccelIPSvr = LoadAccelerators(
        !          1845:             hInst, 
        !          1846:             "InPlaceSvrOutlAccel"
        !          1847:     );
        !          1848: 
        !          1849:     lpServerApp->m_lpIPData = NULL;
        !          1850:     
        !          1851:     lpServerApp->m_hMenuEdit = GetSubMenu (
        !          1852:             lpOutlineApp->m_hMenuApp, 
        !          1853:             POS_EDITMENU
        !          1854:     );
        !          1855:     lpServerApp->m_hMenuLine = GetSubMenu (
        !          1856:             lpOutlineApp->m_hMenuApp, 
        !          1857:             POS_LINEMENU
        !          1858:     );
        !          1859:     lpServerApp->m_hMenuName = GetSubMenu (
        !          1860:             lpOutlineApp->m_hMenuApp, 
        !          1861:             POS_NAMEMENU
        !          1862:     );
        !          1863:     lpServerApp->m_hMenuOptions = GetSubMenu (
        !          1864:             lpOutlineApp->m_hMenuApp, 
        !          1865:             POS_OPTIONSMENU
        !          1866:     );
        !          1867:     lpServerApp->m_hMenuDebug = GetSubMenu (
        !          1868:             lpOutlineApp->m_hMenuApp, 
        !          1869:             POS_DEBUGMENU
        !          1870:     );
        !          1871:     lpServerApp->m_hMenuHelp = GetSubMenu (
        !          1872:             lpOutlineApp->m_hMenuApp, 
        !          1873:             POS_HELPMENU
        !          1874:     );
        !          1875: 
        !          1876: #endif  // INPLACE_SVR
        !          1877:     
        !          1878:     return TRUE;
        !          1879: }
        !          1880: 
        !          1881:  
        !          1882: /* ServerApp_InitVtbls
        !          1883:  * -------------------
        !          1884:  *
        !          1885:  * initialize the methods in all of the interface Vtbl's
        !          1886:  *
        !          1887:  * OLE2NOTE: we only need one copy of each Vtbl. When an object which 
        !          1888:  *      exposes an interface is instantiated, its lpVtbl is intialized
        !          1889:  *      to point to the single copy of the Vtbl.
        !          1890:  *
        !          1891:  */
        !          1892: BOOL ServerApp_InitVtbls (LPSERVERAPP lpServerApp)
        !          1893: {
        !          1894:     BOOL fStatus;
        !          1895: 
        !          1896:     // ServerDoc::IOleObject method table
        !          1897:     OleStdInitVtbl(&g_SvrDoc_OleObjectVtbl, sizeof(IOleObjectVtbl));
        !          1898:     g_SvrDoc_OleObjectVtbl.QueryInterface   = SvrDoc_OleObj_QueryInterface;
        !          1899:     g_SvrDoc_OleObjectVtbl.AddRef           = SvrDoc_OleObj_AddRef;
        !          1900:     g_SvrDoc_OleObjectVtbl.Release          = SvrDoc_OleObj_Release;
        !          1901:     g_SvrDoc_OleObjectVtbl.SetClientSite    = SvrDoc_OleObj_SetClientSite;
        !          1902:     g_SvrDoc_OleObjectVtbl.GetClientSite    = SvrDoc_OleObj_GetClientSite;
        !          1903:     g_SvrDoc_OleObjectVtbl.SetHostNames     = SvrDoc_OleObj_SetHostNames;
        !          1904:     g_SvrDoc_OleObjectVtbl.Close            = SvrDoc_OleObj_Close;
        !          1905:     g_SvrDoc_OleObjectVtbl.SetMoniker       = SvrDoc_OleObj_SetMoniker;
        !          1906:     g_SvrDoc_OleObjectVtbl.GetMoniker       = SvrDoc_OleObj_GetMoniker;
        !          1907:     g_SvrDoc_OleObjectVtbl.InitFromData     = SvrDoc_OleObj_InitFromData;
        !          1908:     g_SvrDoc_OleObjectVtbl.GetClipboardData = SvrDoc_OleObj_GetClipboardData;
        !          1909:     g_SvrDoc_OleObjectVtbl.DoVerb           = SvrDoc_OleObj_DoVerb; 
        !          1910:     g_SvrDoc_OleObjectVtbl.EnumVerbs        = SvrDoc_OleObj_EnumVerbs;
        !          1911:     g_SvrDoc_OleObjectVtbl.Update           = SvrDoc_OleObj_Update;
        !          1912:     g_SvrDoc_OleObjectVtbl.IsUpToDate       = SvrDoc_OleObj_IsUpToDate;
        !          1913:     g_SvrDoc_OleObjectVtbl.GetUserClassID   = SvrDoc_OleObj_GetUserClassID;
        !          1914:     g_SvrDoc_OleObjectVtbl.GetUserType      = SvrDoc_OleObj_GetUserType;
        !          1915:     g_SvrDoc_OleObjectVtbl.SetExtent        = SvrDoc_OleObj_SetExtent;
        !          1916:     g_SvrDoc_OleObjectVtbl.GetExtent        = SvrDoc_OleObj_GetExtent;
        !          1917:     g_SvrDoc_OleObjectVtbl.Advise           = SvrDoc_OleObj_Advise;
        !          1918:     g_SvrDoc_OleObjectVtbl.Unadvise         = SvrDoc_OleObj_Unadvise;
        !          1919:     g_SvrDoc_OleObjectVtbl.EnumAdvise       = SvrDoc_OleObj_EnumAdvise;
        !          1920:     g_SvrDoc_OleObjectVtbl.GetMiscStatus    = SvrDoc_OleObj_GetMiscStatus;
        !          1921:     g_SvrDoc_OleObjectVtbl.SetColorScheme   = SvrDoc_OleObj_SetColorScheme;
        !          1922:     fStatus = OleStdCheckVtbl(
        !          1923:             &g_SvrDoc_OleObjectVtbl, 
        !          1924:             sizeof(IOleObjectVtbl), 
        !          1925:             "IOleObject"
        !          1926:         );
        !          1927:     if (! fStatus) return FALSE;
        !          1928: 
        !          1929:     // ServerDoc::IPersistStorage method table
        !          1930:     OleStdInitVtbl(&g_SvrDoc_PersistStorageVtbl, sizeof(IPersistStorageVtbl));
        !          1931:     g_SvrDoc_PersistStorageVtbl.QueryInterface  = SvrDoc_PStg_QueryInterface;
        !          1932:     g_SvrDoc_PersistStorageVtbl.AddRef          = SvrDoc_PStg_AddRef;
        !          1933:     g_SvrDoc_PersistStorageVtbl.Release         = SvrDoc_PStg_Release;
        !          1934:     g_SvrDoc_PersistStorageVtbl.GetClassID      = SvrDoc_PStg_GetClassID;
        !          1935:     g_SvrDoc_PersistStorageVtbl.IsDirty         = SvrDoc_PStg_IsDirty;
        !          1936:     g_SvrDoc_PersistStorageVtbl.InitNew         = SvrDoc_PStg_InitNew;
        !          1937:     g_SvrDoc_PersistStorageVtbl.Load            = SvrDoc_PStg_Load;
        !          1938:     g_SvrDoc_PersistStorageVtbl.Save            = SvrDoc_PStg_Save;
        !          1939:     g_SvrDoc_PersistStorageVtbl.SaveCompleted   = SvrDoc_PStg_SaveCompleted;
        !          1940:     g_SvrDoc_PersistStorageVtbl.HandsOffStorage = SvrDoc_PStg_HandsOffStorage;
        !          1941:     fStatus = OleStdCheckVtbl(
        !          1942:             &g_SvrDoc_PersistStorageVtbl, 
        !          1943:             sizeof(IPersistStorageVtbl), 
        !          1944:             "IPersistStorage"
        !          1945:         );
        !          1946:     if (! fStatus) return FALSE;
        !          1947: 
        !          1948: #if defined( SVR_TREATAS )
        !          1949:     // ServerDoc::IStdMarshalInfo method table
        !          1950:     OleStdInitVtbl(
        !          1951:             &g_SvrDoc_StdMarshalInfoVtbl, sizeof(IStdMarshalInfoVtbl));
        !          1952:     g_SvrDoc_StdMarshalInfoVtbl.QueryInterface  = 
        !          1953:                                             SvrDoc_StdMshl_QueryInterface;
        !          1954:     g_SvrDoc_StdMarshalInfoVtbl.AddRef          = SvrDoc_StdMshl_AddRef;
        !          1955:     g_SvrDoc_StdMarshalInfoVtbl.Release         = SvrDoc_StdMshl_Release;
        !          1956:     g_SvrDoc_StdMarshalInfoVtbl.GetClassForHandler = 
        !          1957:                                             SvrDoc_StdMshl_GetClassForHandler;
        !          1958:     fStatus = OleStdCheckVtbl(
        !          1959:             &g_SvrDoc_StdMarshalInfoVtbl, 
        !          1960:             sizeof(IStdMarshalInfoVtbl), 
        !          1961:             "IStdMarshalInfo"
        !          1962:         );
        !          1963:     if (! fStatus) return FALSE;
        !          1964: #endif  // SVR_TREATAS
        !          1965:     
        !          1966: #if defined( INPLACE_SVR )
        !          1967:     // ServerDoc::IOleInPlaceObject method table
        !          1968:     OleStdInitVtbl(
        !          1969:         &g_SvrDoc_OleInPlaceObjectVtbl, 
        !          1970:         sizeof(IOleInPlaceObjectVtbl)
        !          1971:     );
        !          1972:     g_SvrDoc_OleInPlaceObjectVtbl.QueryInterface    
        !          1973:                         = SvrDoc_IPObj_QueryInterface;
        !          1974:     g_SvrDoc_OleInPlaceObjectVtbl.AddRef            
        !          1975:                         = SvrDoc_IPObj_AddRef;
        !          1976:     g_SvrDoc_OleInPlaceObjectVtbl.Release           
        !          1977:                         = SvrDoc_IPObj_Release;
        !          1978:     g_SvrDoc_OleInPlaceObjectVtbl.GetWindow 
        !          1979:                         = SvrDoc_IPObj_GetWindow;
        !          1980:     g_SvrDoc_OleInPlaceObjectVtbl.ContextSensitiveHelp
        !          1981:                         = SvrDoc_IPObj_ContextSensitiveHelp;
        !          1982:     g_SvrDoc_OleInPlaceObjectVtbl.InPlaceDeactivate
        !          1983:                         = SvrDoc_IPObj_InPlaceDeactivate;
        !          1984:     g_SvrDoc_OleInPlaceObjectVtbl.UIDeactivate
        !          1985:                         = SvrDoc_IPObj_UIDeactivate;
        !          1986:     g_SvrDoc_OleInPlaceObjectVtbl.SetObjectRects
        !          1987:                         = SvrDoc_IPObj_SetObjectRects;
        !          1988:     g_SvrDoc_OleInPlaceObjectVtbl.ReactivateAndUndo
        !          1989:                         = SvrDoc_IPObj_ReactivateAndUndo;
        !          1990:     fStatus = OleStdCheckVtbl(
        !          1991:             &g_SvrDoc_OleInPlaceObjectVtbl, 
        !          1992:             sizeof(IOleInPlaceObjectVtbl), 
        !          1993:             "IOleInPlaceObject"
        !          1994:         );
        !          1995:     if (! fStatus) return FALSE;
        !          1996: 
        !          1997:     // ServerDoc::IOleInPlaceActiveObject method table
        !          1998:     OleStdInitVtbl(
        !          1999:         &g_SvrDoc_OleInPlaceActiveObjectVtbl, 
        !          2000:         sizeof(IOleInPlaceActiveObjectVtbl)
        !          2001:     );
        !          2002:     g_SvrDoc_OleInPlaceActiveObjectVtbl.QueryInterface  
        !          2003:                         = SvrDoc_IPActiveObj_QueryInterface;
        !          2004:     g_SvrDoc_OleInPlaceActiveObjectVtbl.AddRef          
        !          2005:                         = SvrDoc_IPActiveObj_AddRef;
        !          2006:     g_SvrDoc_OleInPlaceActiveObjectVtbl.Release         
        !          2007:                         = SvrDoc_IPActiveObj_Release;
        !          2008:     g_SvrDoc_OleInPlaceActiveObjectVtbl.GetWindow   
        !          2009:                         = SvrDoc_IPActiveObj_GetWindow;
        !          2010:     g_SvrDoc_OleInPlaceActiveObjectVtbl.ContextSensitiveHelp
        !          2011:                         = SvrDoc_IPActiveObj_ContextSensitiveHelp;
        !          2012:     g_SvrDoc_OleInPlaceActiveObjectVtbl.TranslateAccelerator
        !          2013:                         = SvrDoc_IPActiveObj_TranslateAccelerator;
        !          2014:     g_SvrDoc_OleInPlaceActiveObjectVtbl.OnFrameWindowActivate
        !          2015:                         = SvrDoc_IPActiveObj_OnFrameWindowActivate;
        !          2016:     g_SvrDoc_OleInPlaceActiveObjectVtbl.OnDocWindowActivate
        !          2017:                         = SvrDoc_IPActiveObj_OnDocWindowActivate;
        !          2018:     g_SvrDoc_OleInPlaceActiveObjectVtbl.ResizeBorder
        !          2019:                         = SvrDoc_IPActiveObj_ResizeBorder;
        !          2020:     g_SvrDoc_OleInPlaceActiveObjectVtbl.EnableModeless
        !          2021:                         = SvrDoc_IPActiveObj_EnableModeless;
        !          2022:     fStatus = OleStdCheckVtbl(
        !          2023:             &g_SvrDoc_OleInPlaceActiveObjectVtbl, 
        !          2024:             sizeof(IOleInPlaceActiveObjectVtbl), 
        !          2025:             "IOleInPlaceActiveObject"
        !          2026:         );
        !          2027:     if (! fStatus) return FALSE;
        !          2028: 
        !          2029: #endif  
        !          2030:     
        !          2031:     
        !          2032:     // PseudoObj::IUnknown method table
        !          2033:     OleStdInitVtbl(&g_PseudoObj_UnknownVtbl, sizeof(IUnknownVtbl));
        !          2034:     g_PseudoObj_UnknownVtbl.QueryInterface  = PseudoObj_Unk_QueryInterface;
        !          2035:     g_PseudoObj_UnknownVtbl.AddRef          = PseudoObj_Unk_AddRef;
        !          2036:     g_PseudoObj_UnknownVtbl.Release         = PseudoObj_Unk_Release;
        !          2037:     fStatus = OleStdCheckVtbl(
        !          2038:             &g_PseudoObj_UnknownVtbl, 
        !          2039:             sizeof(IUnknownVtbl), 
        !          2040:             "IUnknown"
        !          2041:         );
        !          2042:     if (! fStatus) return FALSE;
        !          2043: 
        !          2044:     // PseudoObj::IOleObject method table
        !          2045:     OleStdInitVtbl(&g_PseudoObj_OleObjectVtbl, sizeof(IOleObjectVtbl));
        !          2046:     g_PseudoObj_OleObjectVtbl.QueryInterface= PseudoObj_OleObj_QueryInterface;
        !          2047:     g_PseudoObj_OleObjectVtbl.AddRef        = PseudoObj_OleObj_AddRef;
        !          2048:     g_PseudoObj_OleObjectVtbl.Release       = PseudoObj_OleObj_Release;
        !          2049:     g_PseudoObj_OleObjectVtbl.SetClientSite = PseudoObj_OleObj_SetClientSite;
        !          2050:     g_PseudoObj_OleObjectVtbl.GetClientSite = PseudoObj_OleObj_GetClientSite;
        !          2051:     g_PseudoObj_OleObjectVtbl.SetHostNames  = PseudoObj_OleObj_SetHostNames;
        !          2052:     g_PseudoObj_OleObjectVtbl.Close         = PseudoObj_OleObj_Close;
        !          2053:     g_PseudoObj_OleObjectVtbl.SetMoniker    = PseudoObj_OleObj_SetMoniker;
        !          2054:     g_PseudoObj_OleObjectVtbl.GetMoniker    = PseudoObj_OleObj_GetMoniker;
        !          2055:     g_PseudoObj_OleObjectVtbl.InitFromData  = PseudoObj_OleObj_InitFromData;
        !          2056:     g_PseudoObj_OleObjectVtbl.GetClipboardData = 
        !          2057:                                             PseudoObj_OleObj_GetClipboardData;
        !          2058:     g_PseudoObj_OleObjectVtbl.DoVerb        = PseudoObj_OleObj_DoVerb;  
        !          2059:     g_PseudoObj_OleObjectVtbl.EnumVerbs     = PseudoObj_OleObj_EnumVerbs;
        !          2060:     g_PseudoObj_OleObjectVtbl.Update        = PseudoObj_OleObj_Update;
        !          2061:     g_PseudoObj_OleObjectVtbl.IsUpToDate    = PseudoObj_OleObj_IsUpToDate;
        !          2062:     g_PseudoObj_OleObjectVtbl.GetUserType   = PseudoObj_OleObj_GetUserType;
        !          2063:     g_PseudoObj_OleObjectVtbl.GetUserClassID= PseudoObj_OleObj_GetUserClassID;
        !          2064:     g_PseudoObj_OleObjectVtbl.SetExtent     = PseudoObj_OleObj_SetExtent;
        !          2065:     g_PseudoObj_OleObjectVtbl.GetExtent     = PseudoObj_OleObj_GetExtent;
        !          2066:     g_PseudoObj_OleObjectVtbl.Advise        = PseudoObj_OleObj_Advise;
        !          2067:     g_PseudoObj_OleObjectVtbl.Unadvise      = PseudoObj_OleObj_Unadvise;
        !          2068:     g_PseudoObj_OleObjectVtbl.EnumAdvise    = PseudoObj_OleObj_EnumAdvise;
        !          2069:     g_PseudoObj_OleObjectVtbl.GetMiscStatus = PseudoObj_OleObj_GetMiscStatus;
        !          2070:     g_PseudoObj_OleObjectVtbl.SetColorScheme= PseudoObj_OleObj_SetColorScheme;
        !          2071:     fStatus = OleStdCheckVtbl(
        !          2072:             &g_PseudoObj_OleObjectVtbl, 
        !          2073:             sizeof(IOleObjectVtbl), 
        !          2074:             "IOleObject"
        !          2075:         );
        !          2076:     if (! fStatus) return FALSE;
        !          2077: 
        !          2078:     // ServerDoc::IDataObject method table
        !          2079:     OleStdInitVtbl(&g_PseudoObj_DataObjectVtbl, sizeof(IDataObjectVtbl));
        !          2080:     g_PseudoObj_DataObjectVtbl.QueryInterface = 
        !          2081:                                     PseudoObj_DataObj_QueryInterface;
        !          2082:     g_PseudoObj_DataObjectVtbl.AddRef       = PseudoObj_DataObj_AddRef;
        !          2083:     g_PseudoObj_DataObjectVtbl.Release      = PseudoObj_DataObj_Release;
        !          2084:     g_PseudoObj_DataObjectVtbl.GetData      = PseudoObj_DataObj_GetData;
        !          2085:     g_PseudoObj_DataObjectVtbl.GetDataHere  = PseudoObj_DataObj_GetDataHere;
        !          2086:     g_PseudoObj_DataObjectVtbl.QueryGetData = PseudoObj_DataObj_QueryGetData;
        !          2087:     g_PseudoObj_DataObjectVtbl.GetCanonicalFormatEtc = 
        !          2088:                                     PseudoObj_DataObj_GetCanonicalFormatEtc;
        !          2089:     g_PseudoObj_DataObjectVtbl.SetData      = PseudoObj_DataObj_SetData;
        !          2090:     g_PseudoObj_DataObjectVtbl.EnumFormatEtc= PseudoObj_DataObj_EnumFormatEtc;
        !          2091:     g_PseudoObj_DataObjectVtbl.DAdvise       = PseudoObj_DataObj_Advise;
        !          2092:     g_PseudoObj_DataObjectVtbl.DUnadvise     = PseudoObj_DataObj_Unadvise;
        !          2093:     g_PseudoObj_DataObjectVtbl.EnumDAdvise   = PseudoObj_DataObj_EnumAdvise;
        !          2094: 
        !          2095:     fStatus = OleStdCheckVtbl(
        !          2096:             &g_PseudoObj_DataObjectVtbl, 
        !          2097:             sizeof(IDataObjectVtbl), 
        !          2098:             "IDataObject"
        !          2099:         );
        !          2100:     if (! fStatus) return FALSE;
        !          2101: 
        !          2102:     return TRUE;
        !          2103: }
        !          2104: 
        !          2105: #endif  // OLE_SERVER
        !          2106: 
        !          2107: 
        !          2108: 
        !          2109: #if defined( OLE_CNTR )
        !          2110: 
        !          2111: /*************************************************************************
        !          2112: ** ContainerDoc Supprt Functions Used by Container versions
        !          2113: *************************************************************************/
        !          2114: 
        !          2115: 
        !          2116: /* ContainerApp_InitInstance
        !          2117:  * -------------------------
        !          2118:  *
        !          2119:  * Initialize the app instance by creating the main frame window and
        !          2120:  * performing app instance specific initializations
        !          2121:  *  (eg. initializing interface Vtbls).
        !          2122:  *
        !          2123:  * RETURNS: TRUE if the memory could be allocated, and the server app
        !          2124:  *               was properly initialized.
        !          2125:  *          FALSE otherwise
        !          2126:  *
        !          2127:  */
        !          2128: 
        !          2129: BOOL ContainerApp_InitInstance(
        !          2130:         LPCONTAINERAPP          lpContainerApp,
        !          2131:         HINSTANCE               hInst,
        !          2132:         int                     nCmdShow
        !          2133: )
        !          2134: {
        !          2135:     LPOLEAPP lpOleApp = (LPOLEAPP)lpContainerApp;
        !          2136:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)lpContainerApp;
        !          2137: 
        !          2138:     lpContainerApp->m_cfCntrOutl=RegisterClipboardFormat(CONTAINERDOCFORMAT);
        !          2139:     if(! lpContainerApp->m_cfCntrOutl) {
        !          2140:         // REVIEW: should load string from string resource
        !          2141:         OutlineApp_ErrorMessage(lpOutlineApp, "Can't register clipboard format!");
        !          2142:         return FALSE;
        !          2143:     }
        !          2144: 
        !          2145: #if defined( INPLACE_CNTR )
        !          2146: 
        !          2147:     lpContainerApp->m_fPendingUIDeactivate  = FALSE;
        !          2148:     lpContainerApp->m_lpIPActiveObj         = NULL;
        !          2149:     lpContainerApp->m_hAccelIPCntr = LoadAccelerators(
        !          2150:             hInst,
        !          2151:             "InPlaceCntrOutlAccel"
        !          2152:     );
        !          2153:     lpContainerApp->m_hMenuFile = GetSubMenu (
        !          2154:             lpOutlineApp->m_hMenuApp,
        !          2155:             POS_FILEMENU
        !          2156:     );
        !          2157:     lpContainerApp->m_hMenuView = GetSubMenu (
        !          2158:             lpOutlineApp->m_hMenuApp,
        !          2159:             POS_VIEWMENU
        !          2160:     );
        !          2161:     lpContainerApp->m_hMenuDebug = GetSubMenu (
        !          2162:             lpOutlineApp->m_hMenuApp,
        !          2163:             POS_DEBUGMENU
        !          2164:     );
        !          2165: 
        !          2166:     INIT_INTERFACEIMPL(
        !          2167:             &lpContainerApp->m_OleInPlaceFrame,
        !          2168:             &g_CntrApp_OleInPlaceFrameVtbl,
        !          2169:             lpContainerApp
        !          2170:     );
        !          2171: 
        !          2172: #endif
        !          2173: 
        !          2174:     /* Setup arrays used by IDataObject::EnumFormatEtc. This is used to
        !          2175:     **    support copy/paste and drag/drop operations.
        !          2176:     **
        !          2177:     ** OLE2NOTE: The order that the formats are listed for GetData is very
        !          2178:     **    significant. It should be listed in order of highest fidelity
        !          2179:     **    formats to least fidelity formats. A common ordering will be:
        !          2180:     **                  1. private app formats
        !          2181:     **                  2. CF_EMBEDSOURCE or CF_EMBEDOBJECT (as appropriate)
        !          2182:     **                  3. lower fidelity interchange formats
        !          2183:     **                  4. CF_METAFILEPICT
        !          2184:     **                      (graphic-related apps might offer picture 1st!)
        !          2185:     **                  5. CF_OBJECTDESCRIPTOR
        !          2186:     **                  6. CF_LINKSOURCE
        !          2187:     **                  6. CF_LINKSRCDESCRIPTOR
        !          2188:     */
        !          2189: 
        !          2190:     /* m_arrDocGetFmts array enumerates the formats that a ContainerDoc
        !          2191:     **    object can offer (give) through a IDataObject::GetData call
        !          2192:        **    when the selection copied is NOT a single embedded object.
        !          2193:        **    when a single embedded object this list of formats available
        !          2194:        **    is built dynamically depending on the object copied. (see
        !          2195:        **    ContainerDoc_SetupDocGetFmts). 
        !          2196:     **    The formats are listed in priority order.
        !          2197:     **    ContainerDoc objects accept data formats in the following order:
        !          2198:     **                  1. CF_CNTROUTL
        !          2199:     **                  2. CF_OUTLINE
        !          2200:     **                  3. CF_TEXT
        !          2201:     **                  4. CF_OBJECTDESCRIPTOR
        !          2202:        **    
        !          2203:        **    OLE2NOTE: CF_OBJECTDESCRIPTOR format is used to describe the
        !          2204:        **    data on the clipboard. this information is intended to be
        !          2205:        **    used, for example, to drive the PasteSpecial dialog. it is
        !          2206:        **    useful to render CF_OBJECTDESCRIPTOR format even when the
        !          2207:        **    data on the clipboard does NOT include CF_EMBEDDEDOBJECT
        !          2208:        **    format or CF_EMBEDSOURCE format as when a selection that is
        !          2209:        **    not a single OLE object is copied from the container only
        !          2210:        **    version CNTROUTL. by rendering CF_OBJECTDESCRIPTOR format the
        !          2211:        **    app can indicate a useful string to identifiy the source of
        !          2212:        **    the copy to the user.
        !          2213:     */
        !          2214: 
        !          2215:     lpOleApp->m_arrDocGetFmts[0].cfFormat = lpContainerApp->m_cfCntrOutl;
        !          2216:     lpOleApp->m_arrDocGetFmts[0].ptd      = NULL;
        !          2217:     lpOleApp->m_arrDocGetFmts[0].dwAspect = DVASPECT_CONTENT;
        !          2218:     lpOleApp->m_arrDocGetFmts[0].tymed    = TYMED_ISTORAGE;
        !          2219:     lpOleApp->m_arrDocGetFmts[0].lindex   = -1;
        !          2220: 
        !          2221:     lpOleApp->m_arrDocGetFmts[1].cfFormat = lpOutlineApp->m_cfOutline;
        !          2222:     lpOleApp->m_arrDocGetFmts[1].ptd      = NULL;
        !          2223:     lpOleApp->m_arrDocGetFmts[1].dwAspect = DVASPECT_CONTENT;
        !          2224:     lpOleApp->m_arrDocGetFmts[1].tymed    = TYMED_HGLOBAL;
        !          2225:     lpOleApp->m_arrDocGetFmts[1].lindex   = -1;
        !          2226: 
        !          2227:     lpOleApp->m_arrDocGetFmts[2].cfFormat = CF_TEXT;
        !          2228:     lpOleApp->m_arrDocGetFmts[2].ptd      = NULL;
        !          2229:     lpOleApp->m_arrDocGetFmts[2].dwAspect = DVASPECT_CONTENT;
        !          2230:     lpOleApp->m_arrDocGetFmts[2].tymed    = TYMED_HGLOBAL;
        !          2231:     lpOleApp->m_arrDocGetFmts[2].lindex   = -1;
        !          2232: 
        !          2233:     lpOleApp->m_arrDocGetFmts[3].cfFormat = lpOleApp->m_cfObjectDescriptor;
        !          2234:     lpOleApp->m_arrDocGetFmts[3].ptd      = NULL;
        !          2235:     lpOleApp->m_arrDocGetFmts[3].dwAspect = DVASPECT_CONTENT;
        !          2236:     lpOleApp->m_arrDocGetFmts[3].tymed    = TYMED_HGLOBAL;
        !          2237:     lpOleApp->m_arrDocGetFmts[3].lindex   = -1;
        !          2238: 
        !          2239:     lpOleApp->m_nDocGetFmts = 4;
        !          2240: 
        !          2241:     /* m_arrSingleObjGetFmts array enumerates the formats that a 
        !          2242:     **    ContainerDoc object can offer (give) through a
        !          2243:     **    IDataObject::GetData call when the selection copied IS a
        !          2244:     **    single OLE object. 
        !          2245:     **    ContainerDoc objects accept data formats in the following order:
        !          2246:     **                  1. CF_CNTROUTL
        !          2247:     **                  2. CF_EMBEDDEDOBJECT
        !          2248:     **                  3. CF_OBJECTDESCRIPTOR
        !          2249:     **                  4. CF_METAFILEPICT  (note DVASPECT will vary)
        !          2250:     **                  5. CF_OUTLINE
        !          2251:     **                  6. CF_TEXT
        !          2252:     **                  7. CF_LINKSOURCE *
        !          2253:     **                  8. CF_LINKSRCDESCRIPTOR *
        !          2254:     **    
        !          2255:     **    * OLE2NOTE: CF_LINKSOURCE and CF_LINKSRCDESCRIPTOR is only
        !          2256:        **    offered if the OLE object is allowed to be linked to from the
        !          2257:     **    inside (ie. we are allowed to give out a moniker which binds
        !          2258:     **    to the running OLE object), then we want to offer
        !          2259:     **    CF_LINKSOURCE format. if the object is an OLE 2.0 embedded
        !          2260:     **    object then it is allowed to be linked to from the inside. if
        !          2261:     **    the object is either an OleLink or an OLE 1.0 embedding then
        !          2262:     **    it can not be linked to from the inside. if we were a
        !          2263:     **    container/server app then we could offer linking to the
        !          2264:     **    outside of the object (ie. a pseudo object within our
        !          2265:     **    document). we are a container only app that does not support
        !          2266:     **    linking to ranges of its data. 
        !          2267:     **    the simplest way to determine if an object can be linked to
        !          2268:     **    on the inside is to call IOleObject::GetMiscStatus and test
        !          2269:     **    to see if the OLEMISC_CANTLINKINSIDE bit is NOT set.
        !          2270:     **    
        !          2271:     **    OLE2NOTE: optionally, a container that wants to have a
        !          2272:     **    potentially richer data transfer, can enumerate the data
        !          2273:     **    formats from the OLE object's cache and offer them too. if
        !          2274:     **    the object has a special handler, then it might be able to
        !          2275:     **    render additional data formats.
        !          2276:     */
        !          2277:     lpContainerApp->m_arrSingleObjGetFmts[0].cfFormat = 
        !          2278:                                                 lpContainerApp->m_cfCntrOutl;
        !          2279:     lpContainerApp->m_arrSingleObjGetFmts[0].ptd      = NULL;
        !          2280:     lpContainerApp->m_arrSingleObjGetFmts[0].dwAspect = DVASPECT_CONTENT;
        !          2281:     lpContainerApp->m_arrSingleObjGetFmts[0].tymed    = TYMED_ISTORAGE;
        !          2282:     lpContainerApp->m_arrSingleObjGetFmts[0].lindex   = -1;
        !          2283: 
        !          2284:     lpContainerApp->m_arrSingleObjGetFmts[1].cfFormat = 
        !          2285:                                                 lpOleApp->m_cfEmbeddedObject;
        !          2286:     lpContainerApp->m_arrSingleObjGetFmts[1].ptd      = NULL;
        !          2287:     lpContainerApp->m_arrSingleObjGetFmts[1].dwAspect = DVASPECT_CONTENT;
        !          2288:     lpContainerApp->m_arrSingleObjGetFmts[1].tymed    = TYMED_ISTORAGE;
        !          2289:     lpContainerApp->m_arrSingleObjGetFmts[1].lindex   = -1;
        !          2290: 
        !          2291:     lpContainerApp->m_arrSingleObjGetFmts[2].cfFormat = 
        !          2292:                                                lpOleApp->m_cfObjectDescriptor;
        !          2293:     lpContainerApp->m_arrSingleObjGetFmts[2].ptd      = NULL;
        !          2294:     lpContainerApp->m_arrSingleObjGetFmts[2].dwAspect = DVASPECT_CONTENT;
        !          2295:     lpContainerApp->m_arrSingleObjGetFmts[2].tymed    = TYMED_HGLOBAL;
        !          2296:     lpContainerApp->m_arrSingleObjGetFmts[2].lindex   = -1;
        !          2297: 
        !          2298:     lpContainerApp->m_arrSingleObjGetFmts[3].cfFormat = CF_METAFILEPICT;
        !          2299:     lpContainerApp->m_arrSingleObjGetFmts[3].ptd      = NULL;
        !          2300:     lpContainerApp->m_arrSingleObjGetFmts[3].dwAspect = DVASPECT_CONTENT;
        !          2301:     lpContainerApp->m_arrSingleObjGetFmts[3].tymed    = TYMED_MFPICT;
        !          2302:     lpContainerApp->m_arrSingleObjGetFmts[3].lindex   = -1;
        !          2303: 
        !          2304:     lpContainerApp->m_arrSingleObjGetFmts[4].cfFormat =
        !          2305:                                                     lpOutlineApp->m_cfOutline;
        !          2306:     lpContainerApp->m_arrSingleObjGetFmts[4].ptd      = NULL;
        !          2307:     lpContainerApp->m_arrSingleObjGetFmts[4].dwAspect = DVASPECT_CONTENT;
        !          2308:     lpContainerApp->m_arrSingleObjGetFmts[4].tymed    = TYMED_HGLOBAL;
        !          2309:     lpContainerApp->m_arrSingleObjGetFmts[4].lindex   = -1;
        !          2310: 
        !          2311:     lpContainerApp->m_arrSingleObjGetFmts[5].cfFormat = CF_TEXT;
        !          2312:     lpContainerApp->m_arrSingleObjGetFmts[5].ptd      = NULL;
        !          2313:     lpContainerApp->m_arrSingleObjGetFmts[5].dwAspect = DVASPECT_CONTENT;
        !          2314:     lpContainerApp->m_arrSingleObjGetFmts[5].tymed    = TYMED_HGLOBAL;
        !          2315:     lpContainerApp->m_arrSingleObjGetFmts[5].lindex   = -1;
        !          2316: 
        !          2317:     lpContainerApp->m_arrSingleObjGetFmts[6].cfFormat = 
        !          2318:                                                     lpOleApp->m_cfLinkSource;
        !          2319:     lpContainerApp->m_arrSingleObjGetFmts[6].ptd      = NULL;
        !          2320:     lpContainerApp->m_arrSingleObjGetFmts[6].dwAspect = DVASPECT_CONTENT;
        !          2321:     lpContainerApp->m_arrSingleObjGetFmts[6].tymed    = TYMED_ISTREAM;
        !          2322:     lpContainerApp->m_arrSingleObjGetFmts[6].lindex   = -1;
        !          2323: 
        !          2324:     lpContainerApp->m_arrSingleObjGetFmts[7].cfFormat = 
        !          2325:                                               lpOleApp->m_cfLinkSrcDescriptor;
        !          2326:     lpContainerApp->m_arrSingleObjGetFmts[7].ptd      = NULL;
        !          2327:     lpContainerApp->m_arrSingleObjGetFmts[7].dwAspect = DVASPECT_CONTENT;
        !          2328:     lpContainerApp->m_arrSingleObjGetFmts[7].tymed    = TYMED_HGLOBAL;
        !          2329:     lpContainerApp->m_arrSingleObjGetFmts[7].lindex   = -1;
        !          2330: 
        !          2331:     lpContainerApp->m_nSingleObjGetFmts = 8;
        !          2332: 
        !          2333:     /* NOTE: the Container-Only version of Outline does NOT offer
        !          2334:     **    IDataObject interface from its User documents and the
        !          2335:     **    IDataObject interface available from DataTransferDoc's do NOT
        !          2336:     **    support SetData. IDataObject interface is required by objects
        !          2337:     **    which can be embedded or linked. the Container-only app only
        !          2338:     **    allows linking to its contained objects, NOT the data of the
        !          2339:     **    container itself.
        !          2340:     */
        !          2341: 
        !          2342:     /*    m_arrPasteEntries array enumerates the formats that a ContainerDoc
        !          2343:     **    object can accept from the clipboard. this array is used to
        !          2344:     **    support the PasteSpecial dialog.
        !          2345:     **    The formats are listed in priority order.
        !          2346:     **    ContainerDoc objects accept data formats in the following order:
        !          2347:     **                  1. CF_CNTROUTL
        !          2348:     **                  2. CF_OUTLINE
        !          2349:     **                  3. CF_EMBEDDEDOBJECT
        !          2350:     **                  4. CF_TEXT
        !          2351:     **                  5. CF_METAFILEPICT
        !          2352:     **                  6. CF_DIB
        !          2353:     **                  7. CF_BITMAP
        !          2354:     **                  8. CF_LINKSOURCE
        !          2355:        **    
        !          2356:        **    NOTE: specifying CF_EMBEDDEDOBJECT in the PasteEntry array
        !          2357:     **    indicates that the caller is interested in pasting OLE
        !          2358:     **    objects (ie. the caller calls OleCreateFromData). the
        !          2359:     **    OleUIPasteSpecial dialog and OleStdGetPriorityClipboardFormat
        !          2360:     **    call OleQueryCreateFromData to see if an OLE object format is
        !          2361:     **    available. thus, in fact if CF_EMBEDSOURCE or CF_FILENAME are
        !          2362:     **    available from the data source then and OLE object can be
        !          2363:     **    created and this entry will be matched. the caller should
        !          2364:     **    only specify one object type format.
        !          2365:     **    CF_FILENAME format (as generated by copying a file to
        !          2366:        **    the clipboard from the FileManager) is considered an object
        !          2367:     **    format; OleCreatFromData creates an object if the file has an
        !          2368:        **    associated class (see GetClassFile API) or if no class it
        !          2369:     **    creates an OLE 1.0 Package object. this format can also be
        !          2370:     **    paste linked by calling OleCreateLinkFromData.
        !          2371:     */
        !          2372:     // REVIEW: strings should be loaded from string resource
        !          2373: 
        !          2374:     lpOleApp->m_arrPasteEntries[0].fmtetc.cfFormat =
        !          2375:                                     lpContainerApp->m_cfCntrOutl;
        !          2376:     lpOleApp->m_arrPasteEntries[0].fmtetc.ptd      = NULL;
        !          2377:     lpOleApp->m_arrPasteEntries[0].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2378:     lpOleApp->m_arrPasteEntries[0].fmtetc.tymed    = TYMED_ISTORAGE;
        !          2379:     lpOleApp->m_arrPasteEntries[0].fmtetc.lindex   = -1;
        !          2380:     lpOleApp->m_arrPasteEntries[0].lpstrFormatName = "Container Outline Data";
        !          2381:     lpOleApp->m_arrPasteEntries[0].lpstrResultText = 
        !          2382:                                                                                                "as Container Outline Data";
        !          2383:     lpOleApp->m_arrPasteEntries[0].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          2384: 
        !          2385:     lpOleApp->m_arrPasteEntries[1].fmtetc.cfFormat =lpOutlineApp->m_cfOutline;
        !          2386:     lpOleApp->m_arrPasteEntries[1].fmtetc.ptd      = NULL;
        !          2387:     lpOleApp->m_arrPasteEntries[1].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2388:     lpOleApp->m_arrPasteEntries[1].fmtetc.tymed    = TYMED_HGLOBAL;
        !          2389:     lpOleApp->m_arrPasteEntries[1].fmtetc.lindex   = -1;
        !          2390:     lpOleApp->m_arrPasteEntries[1].lpstrFormatName = "Outline Data";
        !          2391:     lpOleApp->m_arrPasteEntries[1].lpstrResultText = "as Outline Data";
        !          2392:     lpOleApp->m_arrPasteEntries[1].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          2393: 
        !          2394:     lpOleApp->m_arrPasteEntries[2].fmtetc.cfFormat =
        !          2395:                                     lpOleApp->m_cfEmbeddedObject;
        !          2396:     lpOleApp->m_arrPasteEntries[2].fmtetc.ptd      = NULL;
        !          2397:     lpOleApp->m_arrPasteEntries[2].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2398:     lpOleApp->m_arrPasteEntries[2].fmtetc.tymed    = TYMED_ISTORAGE;
        !          2399:     lpOleApp->m_arrPasteEntries[2].fmtetc.lindex   = -1;
        !          2400:     lpOleApp->m_arrPasteEntries[2].lpstrFormatName = "%s";
        !          2401:     lpOleApp->m_arrPasteEntries[2].lpstrResultText = "%s";
        !          2402:     lpOleApp->m_arrPasteEntries[2].dwFlags         = 
        !          2403:                                     OLEUIPASTE_PASTE | OLEUIPASTE_ENABLEICON;
        !          2404: 
        !          2405:     lpOleApp->m_arrPasteEntries[3].fmtetc.cfFormat = CF_TEXT;
        !          2406:     lpOleApp->m_arrPasteEntries[3].fmtetc.ptd      = NULL;
        !          2407:     lpOleApp->m_arrPasteEntries[3].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2408:     lpOleApp->m_arrPasteEntries[3].fmtetc.tymed    = TYMED_HGLOBAL;
        !          2409:     lpOleApp->m_arrPasteEntries[3].fmtetc.lindex   = -1;
        !          2410:     lpOleApp->m_arrPasteEntries[3].lpstrFormatName = "Text";
        !          2411:     lpOleApp->m_arrPasteEntries[3].lpstrResultText = "as text";
        !          2412:     lpOleApp->m_arrPasteEntries[3].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          2413: 
        !          2414:     lpOleApp->m_arrPasteEntries[4].fmtetc.cfFormat = CF_METAFILEPICT;
        !          2415:     lpOleApp->m_arrPasteEntries[4].fmtetc.ptd      = NULL;
        !          2416:     lpOleApp->m_arrPasteEntries[4].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2417:     lpOleApp->m_arrPasteEntries[4].fmtetc.tymed    = TYMED_MFPICT;
        !          2418:     lpOleApp->m_arrPasteEntries[4].fmtetc.lindex   = -1;
        !          2419:     lpOleApp->m_arrPasteEntries[4].lpstrFormatName = "Picture (Metafile)";
        !          2420:     lpOleApp->m_arrPasteEntries[4].lpstrResultText = "as a static picture";
        !          2421:     lpOleApp->m_arrPasteEntries[4].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          2422: 
        !          2423:     lpOleApp->m_arrPasteEntries[5].fmtetc.cfFormat = CF_DIB;
        !          2424:     lpOleApp->m_arrPasteEntries[5].fmtetc.ptd      = NULL;
        !          2425:     lpOleApp->m_arrPasteEntries[5].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2426:     lpOleApp->m_arrPasteEntries[5].fmtetc.tymed    = TYMED_HGLOBAL;
        !          2427:     lpOleApp->m_arrPasteEntries[5].fmtetc.lindex   = -1;
        !          2428:     lpOleApp->m_arrPasteEntries[5].lpstrFormatName = "Picture (DIB)";
        !          2429:     lpOleApp->m_arrPasteEntries[5].lpstrResultText = "as a static picture";
        !          2430:     lpOleApp->m_arrPasteEntries[5].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          2431: 
        !          2432:     lpOleApp->m_arrPasteEntries[6].fmtetc.cfFormat = CF_BITMAP;
        !          2433:     lpOleApp->m_arrPasteEntries[6].fmtetc.ptd      = NULL;
        !          2434:     lpOleApp->m_arrPasteEntries[6].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2435:     lpOleApp->m_arrPasteEntries[6].fmtetc.tymed    = TYMED_GDI;
        !          2436:     lpOleApp->m_arrPasteEntries[6].fmtetc.lindex   = -1;
        !          2437:     lpOleApp->m_arrPasteEntries[6].lpstrFormatName = "Picture (Bitmap)";
        !          2438:     lpOleApp->m_arrPasteEntries[6].lpstrResultText = "as a static picture";
        !          2439:     lpOleApp->m_arrPasteEntries[6].dwFlags         = OLEUIPASTE_PASTEONLY;
        !          2440: 
        !          2441:     lpOleApp->m_arrPasteEntries[7].fmtetc.cfFormat = lpOleApp->m_cfLinkSource;
        !          2442:     lpOleApp->m_arrPasteEntries[7].fmtetc.ptd      = NULL;
        !          2443:     lpOleApp->m_arrPasteEntries[7].fmtetc.dwAspect = DVASPECT_CONTENT;
        !          2444:     lpOleApp->m_arrPasteEntries[7].fmtetc.tymed    = TYMED_ISTREAM;
        !          2445:     lpOleApp->m_arrPasteEntries[7].fmtetc.lindex   = -1;
        !          2446:     lpOleApp->m_arrPasteEntries[7].lpstrFormatName = "%s";
        !          2447:     lpOleApp->m_arrPasteEntries[7].lpstrResultText = "%s";
        !          2448:     lpOleApp->m_arrPasteEntries[7].dwFlags         = 
        !          2449:                                 OLEUIPASTE_LINKTYPE1 | OLEUIPASTE_ENABLEICON;
        !          2450: 
        !          2451:     lpOleApp->m_nPasteEntries = 8;
        !          2452: 
        !          2453:     /*    m_arrLinkTypes array enumerates the link types that a ContainerDoc
        !          2454:     **    object can accept from the clipboard
        !          2455:     */
        !          2456: 
        !          2457:     lpOleApp->m_arrLinkTypes[0] = lpOleApp->m_cfLinkSource;
        !          2458:     lpOleApp->m_nLinkTypes = 1;
        !          2459: 
        !          2460:     return TRUE;
        !          2461: }
        !          2462: 
        !          2463: 
        !          2464: /* ContainerApp_InitVtbls
        !          2465: ** ----------------------
        !          2466: **
        !          2467: **    initialize the interface Vtbl's used to support the OLE 2.0
        !          2468: **    Container functionality.
        !          2469: */
        !          2470: 
        !          2471: BOOL ContainerApp_InitVtbls(LPCONTAINERAPP lpApp)
        !          2472: {
        !          2473:     BOOL fStatus;
        !          2474: 
        !          2475:     // ContainerDoc::IOleUILinkContainer method table
        !          2476:     OleStdInitVtbl(
        !          2477:                        &g_CntrDoc_OleUILinkContainerVtbl,
        !          2478:                        sizeof(IOleUILinkContainerVtbl)
        !          2479:        );
        !          2480:     g_CntrDoc_OleUILinkContainerVtbl.QueryInterface =
        !          2481:                                             CntrDoc_LinkCont_QueryInterface;
        !          2482:     g_CntrDoc_OleUILinkContainerVtbl.AddRef    = CntrDoc_LinkCont_AddRef;
        !          2483:     g_CntrDoc_OleUILinkContainerVtbl.Release   = CntrDoc_LinkCont_Release;
        !          2484:     g_CntrDoc_OleUILinkContainerVtbl.GetNextLink =
        !          2485:                                         CntrDoc_LinkCont_GetNextLink;
        !          2486:     g_CntrDoc_OleUILinkContainerVtbl.SetLinkUpdateOptions =
        !          2487:                                                                                CntrDoc_LinkCont_SetLinkUpdateOptions;
        !          2488:     g_CntrDoc_OleUILinkContainerVtbl.GetLinkUpdateOptions =
        !          2489:                                                                                CntrDoc_LinkCont_GetLinkUpdateOptions;
        !          2490:     g_CntrDoc_OleUILinkContainerVtbl.SetLinkSource =
        !          2491:                                         CntrDoc_LinkCont_SetLinkSource;
        !          2492:     g_CntrDoc_OleUILinkContainerVtbl.GetLinkSource =
        !          2493:                                         CntrDoc_LinkCont_GetLinkSource;
        !          2494:     g_CntrDoc_OleUILinkContainerVtbl.OpenLinkSource =
        !          2495:                                                                                CntrDoc_LinkCont_OpenLinkSource;
        !          2496:     g_CntrDoc_OleUILinkContainerVtbl.UpdateLink =
        !          2497:                                                                                CntrDoc_LinkCont_UpdateLink;
        !          2498:     g_CntrDoc_OleUILinkContainerVtbl.CancelLink =
        !          2499:                                                                                CntrDoc_LinkCont_CancelLink;
        !          2500:     fStatus = OleStdCheckVtbl(
        !          2501:             &g_CntrDoc_OleUILinkContainerVtbl,
        !          2502:             sizeof(IOleUILinkContainerVtbl),
        !          2503:             "IOleUILinkContainer"
        !          2504:         );
        !          2505:     if (! fStatus) return FALSE;
        !          2506: 
        !          2507: #if defined( INPLACE_CNTR )
        !          2508: 
        !          2509:     // ContainerApp::IOleInPlaceFrame interface method table
        !          2510:     OleStdInitVtbl(
        !          2511:             &g_CntrApp_OleInPlaceFrameVtbl,
        !          2512:             sizeof(g_CntrApp_OleInPlaceFrameVtbl)
        !          2513:     );
        !          2514: 
        !          2515:     g_CntrApp_OleInPlaceFrameVtbl.QueryInterface
        !          2516:                         = CntrApp_IPFrame_QueryInterface;
        !          2517:     g_CntrApp_OleInPlaceFrameVtbl.AddRef
        !          2518:                         = CntrApp_IPFrame_AddRef;
        !          2519:     g_CntrApp_OleInPlaceFrameVtbl.Release
        !          2520:                         = CntrApp_IPFrame_Release;
        !          2521:     g_CntrApp_OleInPlaceFrameVtbl.GetWindow
        !          2522:                         = CntrApp_IPFrame_GetWindow;
        !          2523:     g_CntrApp_OleInPlaceFrameVtbl.ContextSensitiveHelp
        !          2524:                         = CntrApp_IPFrame_ContextSensitiveHelp;
        !          2525: 
        !          2526:     g_CntrApp_OleInPlaceFrameVtbl.GetBorder
        !          2527:                         = CntrApp_IPFrame_GetBorder;
        !          2528:     g_CntrApp_OleInPlaceFrameVtbl.RequestBorderSpace
        !          2529:                         = CntrApp_IPFrame_RequestBorderSpace;
        !          2530:     g_CntrApp_OleInPlaceFrameVtbl.SetBorderSpace
        !          2531:                         = CntrApp_IPFrame_SetBorderSpace;
        !          2532:     g_CntrApp_OleInPlaceFrameVtbl.SetActiveObject
        !          2533:                         = CntrApp_IPFrame_SetActiveObject;
        !          2534:     g_CntrApp_OleInPlaceFrameVtbl.InsertMenus
        !          2535:                         = CntrApp_IPFrame_InsertMenus;
        !          2536:     g_CntrApp_OleInPlaceFrameVtbl.SetMenu
        !          2537:                         = CntrApp_IPFrame_SetMenu;
        !          2538:     g_CntrApp_OleInPlaceFrameVtbl.RemoveMenus
        !          2539:                         = CntrApp_IPFrame_RemoveMenus;
        !          2540:     g_CntrApp_OleInPlaceFrameVtbl.SetStatusText
        !          2541:                         = CntrApp_IPFrame_SetStatusText;
        !          2542:     g_CntrApp_OleInPlaceFrameVtbl.EnableModeless
        !          2543:                         = CntrApp_IPFrame_EnableModeless;
        !          2544:     g_CntrApp_OleInPlaceFrameVtbl.TranslateAccelerator
        !          2545:                         = CntrApp_IPFrame_TranslateAccelerator;
        !          2546: 
        !          2547:     fStatus = OleStdCheckVtbl(
        !          2548:             &g_CntrApp_OleInPlaceFrameVtbl,
        !          2549:             sizeof(g_CntrApp_OleInPlaceFrameVtbl),
        !          2550:             "IOleInPlaceFrame"
        !          2551:         );
        !          2552:     if (! fStatus) return FALSE;
        !          2553: 
        !          2554: #endif  // INPLACE_CNTR
        !          2555: 
        !          2556: 
        !          2557:     // ContainerLine::IUnknown interface method table
        !          2558:     OleStdInitVtbl(
        !          2559:             &g_CntrLine_UnknownVtbl,
        !          2560:             sizeof(g_CntrLine_UnknownVtbl)
        !          2561:         );
        !          2562:     g_CntrLine_UnknownVtbl.QueryInterface   = CntrLine_Unk_QueryInterface;
        !          2563:     g_CntrLine_UnknownVtbl.AddRef           = CntrLine_Unk_AddRef;
        !          2564:     g_CntrLine_UnknownVtbl.Release          = CntrLine_Unk_Release;
        !          2565:     fStatus = OleStdCheckVtbl(
        !          2566:             &g_CntrLine_UnknownVtbl,
        !          2567:             sizeof(g_CntrLine_UnknownVtbl),
        !          2568:             "IUnknown"
        !          2569:         );
        !          2570:     if (! fStatus) return FALSE;
        !          2571: 
        !          2572:     // ContainerLine::IOleClientSite interface method table
        !          2573:     OleStdInitVtbl(
        !          2574:             &g_CntrLine_OleClientSiteVtbl,
        !          2575:             sizeof(g_CntrLine_OleClientSiteVtbl)
        !          2576:         );
        !          2577:     g_CntrLine_OleClientSiteVtbl.QueryInterface =
        !          2578:                                             CntrLine_CliSite_QueryInterface;
        !          2579:     g_CntrLine_OleClientSiteVtbl.AddRef       = CntrLine_CliSite_AddRef;
        !          2580:     g_CntrLine_OleClientSiteVtbl.Release      = CntrLine_CliSite_Release;
        !          2581:     g_CntrLine_OleClientSiteVtbl.SaveObject   = CntrLine_CliSite_SaveObject;
        !          2582:     g_CntrLine_OleClientSiteVtbl.GetMoniker   = CntrLine_CliSite_GetMoniker;
        !          2583:     g_CntrLine_OleClientSiteVtbl.GetContainer = CntrLine_CliSite_GetContainer;
        !          2584:     g_CntrLine_OleClientSiteVtbl.ShowObject   = CntrLine_CliSite_ShowObject;
        !          2585:     g_CntrLine_OleClientSiteVtbl.OnShowWindow = CntrLine_CliSite_OnShowWindow;
        !          2586:     g_CntrLine_OleClientSiteVtbl.RequestNewObjectLayout =
        !          2587:                                                                        CntrLine_CliSite_RequestNewObjectLayout;
        !          2588:     fStatus = OleStdCheckVtbl(
        !          2589:             &g_CntrLine_OleClientSiteVtbl,
        !          2590:             sizeof(g_CntrLine_OleClientSiteVtbl),
        !          2591:             "IOleClientSite"
        !          2592:         );
        !          2593:     if (! fStatus) return FALSE;
        !          2594: 
        !          2595:     // ContainerLine::IAdviseSink interface method table
        !          2596:     OleStdInitVtbl(
        !          2597:             &g_CntrLine_AdviseSinkVtbl,
        !          2598:             sizeof(g_CntrLine_AdviseSinkVtbl)
        !          2599:     );
        !          2600:     g_CntrLine_AdviseSinkVtbl.QueryInterface= CntrLine_AdvSink_QueryInterface;
        !          2601:     g_CntrLine_AdviseSinkVtbl.AddRef        = CntrLine_AdvSink_AddRef;
        !          2602:     g_CntrLine_AdviseSinkVtbl.Release       = CntrLine_AdvSink_Release;
        !          2603:     g_CntrLine_AdviseSinkVtbl.OnDataChange  = CntrLine_AdvSink_OnDataChange;
        !          2604:     g_CntrLine_AdviseSinkVtbl.OnViewChange  = CntrLine_AdvSink_OnViewChange;
        !          2605:     g_CntrLine_AdviseSinkVtbl.OnRename      = CntrLine_AdvSink_OnRename;
        !          2606:     g_CntrLine_AdviseSinkVtbl.OnSave        = CntrLine_AdvSink_OnSave;
        !          2607:     g_CntrLine_AdviseSinkVtbl.OnClose       = CntrLine_AdvSink_OnClose;
        !          2608:     fStatus = OleStdCheckVtbl(
        !          2609:             &g_CntrLine_AdviseSinkVtbl,
        !          2610:             sizeof(g_CntrLine_AdviseSinkVtbl),
        !          2611:             "IAdviseSink"
        !          2612:         );
        !          2613:     if (! fStatus) return FALSE;
        !          2614: 
        !          2615: 
        !          2616: #if defined( INPLACE_CNTR )
        !          2617: 
        !          2618:     // ContainerLine::IOleInPlaceSite interface method table
        !          2619:     OleStdInitVtbl(
        !          2620:             &g_CntrLine_OleInPlaceSiteVtbl,
        !          2621:             sizeof(g_CntrLine_OleInPlaceSiteVtbl)
        !          2622:     );
        !          2623: 
        !          2624:     g_CntrLine_OleInPlaceSiteVtbl.QueryInterface
        !          2625:                         = CntrLine_IPSite_QueryInterface;
        !          2626:     g_CntrLine_OleInPlaceSiteVtbl.AddRef
        !          2627:                         = CntrLine_IPSite_AddRef;
        !          2628:     g_CntrLine_OleInPlaceSiteVtbl.Release
        !          2629:                         = CntrLine_IPSite_Release;
        !          2630:     g_CntrLine_OleInPlaceSiteVtbl.GetWindow
        !          2631:                         = CntrLine_IPSite_GetWindow;
        !          2632:     g_CntrLine_OleInPlaceSiteVtbl.ContextSensitiveHelp
        !          2633:                         = CntrLine_IPSite_ContextSensitiveHelp;
        !          2634:     g_CntrLine_OleInPlaceSiteVtbl.CanInPlaceActivate
        !          2635:                         = CntrLine_IPSite_CanInPlaceActivate;
        !          2636:     g_CntrLine_OleInPlaceSiteVtbl.OnInPlaceActivate
        !          2637:                         = CntrLine_IPSite_OnInPlaceActivate;
        !          2638:     g_CntrLine_OleInPlaceSiteVtbl.OnUIActivate
        !          2639:                         = CntrLine_IPSite_OnUIActivate;
        !          2640:     g_CntrLine_OleInPlaceSiteVtbl.GetWindowContext
        !          2641:                         = CntrLine_IPSite_GetWindowContext;
        !          2642:     g_CntrLine_OleInPlaceSiteVtbl.Scroll
        !          2643:                         = CntrLine_IPSite_Scroll;
        !          2644:     g_CntrLine_OleInPlaceSiteVtbl.OnUIDeactivate
        !          2645:                         = CntrLine_IPSite_OnUIDeactivate;
        !          2646: 
        !          2647:     g_CntrLine_OleInPlaceSiteVtbl.OnInPlaceDeactivate
        !          2648:                         = CntrLine_IPSite_OnInPlaceDeactivate;
        !          2649:     g_CntrLine_OleInPlaceSiteVtbl.DiscardUndoState
        !          2650:                         = CntrLine_IPSite_DiscardUndoState;
        !          2651:     g_CntrLine_OleInPlaceSiteVtbl.DeactivateAndUndo
        !          2652:                         = CntrLine_IPSite_DeactivateAndUndo;
        !          2653:     g_CntrLine_OleInPlaceSiteVtbl.OnPosRectChange
        !          2654:                         = CntrLine_IPSite_OnPosRectChange;
        !          2655: 
        !          2656:     fStatus = OleStdCheckVtbl(
        !          2657:             &g_CntrLine_OleInPlaceSiteVtbl,
        !          2658:             sizeof(g_CntrLine_OleInPlaceSiteVtbl),
        !          2659:             "IOleInPlaceSite"
        !          2660:         );
        !          2661:     if (! fStatus) return FALSE;
        !          2662: 
        !          2663: #endif  // INPLACE_CNTR
        !          2664: 
        !          2665:     return TRUE;
        !          2666: }
        !          2667: 
        !          2668: #endif  // OLE_CNTR

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.