⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oleinit.c

📁 英文版的 想要的话可以下载了 为大家服务
💻 C
字号:
/*
 * OLEINIT.C
 *
 * Handles all application and instance-specific initialization that
 * is also specific to OLE.  That which is specific only to the
 * application or instance resides in INIT.C
 *
 * Copyright(c) Microsoft Corp. 1992-1994 All Rights Reserved
 * Win32 version, January 1994
 */

#ifdef MAKEOLESERVER

#include <windows.h>
#include <ole.h>
#include "cosmo.h"
#include "oleglobl.h"




/*
 * FOLEInstanceInit
 *
 * Purpose:
 *  Handles OLE-server specific initialziation:
 *      1.  Register clipboard formats for "Native", "OwnerLink",
 *          and "ObjectLink."
 *      2.  Initialize VTBLs for server, document, and object.
 *      3.  Register the server with OLESVR.
 *      4.  Parse the command line to determine initial window state.
 *      5.  Register a document depending on contents of command line.
 *
 * Parameters:
 *  pOLE            LPXOLEGLOBALS to OLE-specific global variable block.
 *  hInstance       HINSTANCE of the application instance.
 *  pszClass        LPSTR to classname of the server.
 *  ppszCmds        LPSTR FAR to command line argument strings.
 *  nCmdShow        UINT initial ShowWindow command passed to WinMain.
 *
 * Return Value:
 *  BOOL            FALSE if an error occurred, otherwise TRUE and
 *                  pOLE->wCmdShow contains a valid ShowWindow command
 *                  for the initial state of the window.
 */

BOOL WINAPI FOLEInstanceInit(LPXOLEGLOBALS pOLE, HINSTANCE hInstance
    , LPSTR pszClass, LPSTR FAR *ppszCmds, UINT nCmdShow)
    {
    OLESTATUS       os;
    LPSTR           pszT;
    LPCOSMOSERVER   pSvr;
    LPCOSMODOC      pDoc;
    BOOL            fTemp;


    //1. Register clipboard formats.
    pOLE->cfNative    =RegisterClipboardFormat(rgpsz[IDS_NATIVE]);
    pOLE->cfOwnerLink =RegisterClipboardFormat(rgpsz[IDS_OWNERLINK]);
    pOLE->cfObjectLink=RegisterClipboardFormat(rgpsz[IDS_OBJECTLINK]);

    if (0==pOLE->cfNative || 0==pOLE->cfOwnerLink || 0==pOLE->cfObjectLink)
        return FALSE;


    /*
     * 2. Initialize the method tables with functions in OLEVTBL.C
     *    and mark the vtbl's as initialized.
     */
    fTemp=TRUE;
    fTemp&=FOLEVtblInitServer  (hInstance, &pOLE->vtblSvr);
    fTemp&=FOLEVtblInitDocument(hInstance, &pOLE->vtblDoc);
    fTemp&=FOLEVtblInitObject  (hInstance, &pOLE->vtblObj);

    if (!fTemp)
        return FALSE;   //Cleanup will follow through FApplicationExit.


    /*
     * 3. Allocate and initialize the OLESERVER structure, in this
     *    application we call it COSMOSERVER.  Uses the server
     *    constructor in OLESVR.C.
     */

    pSvr=PServerAllocate(&pOLE->vtblSvr);

    if ((LPCOSMOSERVER)NULL==pSvr)
        return FALSE;

    pOLE->pSvr=pSvr;
    pSvr->nCmdShow=nCmdShow;        //By default, use what the app was given.


    //4. Register the server application with OLESVR.DLL
    os=OleRegisterServer(pszClass, (LPOLESERVER)pSvr, &pSvr->lh,
                         hInstance, OLE_SERVER_MULTI);

    if (OLE_OK!=os)
        {
        //ServerRelease will NOT be called so we must free the memory.
        LocalFree(pSvr->hMem);
        return FALSE;
        }



    /*
     * 5. Given the pointer to the command-line strings, ppszCmds,
     *    check if we have "[/ | -]Embedding" and a possible filename.
     *
     * NOTE:  We trust whoever called us to find a filename in
     *        the command line, ignoring anything that starts with
     *        a - or / as an argument.
     */

    pszT=*ppszCmds++;

    //Assume stand-alone configuration.
    pGlob->fOLE=FALSE;
    pSvr->fEmbed=FALSE;
    pSvr->fLink=FALSE;

    if (NULL!=pszT)
        {
        /*
         * If the first parameter has - or / leading, skip that character
         * so we can check for "Embedding"
         */
        if('-'==*pszT || '/'==*pszT)
            pszT++;

        //See if we have Embedding at all, in which case we're doing OLE.
        pGlob->fOLE=!lstrcmp(pszT, rgpsz[IDS_EMBEDDING]);

        //Change the ShowWindow command appropriately if we're doing OLE.
        if (pGlob->fOLE)
            pSvr->nCmdShow=SW_HIDE;


        /*
         * Set fLink if there is an additional filename on the
         * command-line, and point pszT there if so.
         */
        if (NULL!=*ppszCmds)
            {
            pSvr->fLink=TRUE;
            pszT=*ppszCmds;
            }
        else
            {
            pSvr->fEmbed=TRUE;
            pszT=NULL;
            }

        //pszT is either NULL or points to a filename.
        }

    /*
     * 6.  Allocate an OLESERVERDOC (COSMODOC) and initialize.  LPTR
     *     to LocalAlloc initializes everything to NULL.
     */
    pDoc=PDocumentAllocate(&pOLE->vtblDoc);

    if ((LPCOSMODOC)NULL==pDoc)
        {
        //DocRelease will not be called, but ServerRelease will.
        LocalFree(pDoc->hMem);
        OleRevokeServer(pSvr->lh);
        return FALSE;
        }

    pSvr->pDoc=pDoc;


    /*
     * 7.  Register documents as necessary.  Remember to register any
     *     stand-alone or linked document regardless of what you are
     *     doing with OLE.  The only case where you do NOT register is
     *     for starting the application as embedded.
     *
     *     In step 5 we set pszT equal to either NULL (embedding or no
     *     file) or to a filename (linking or stand-alone with a file).
     *     So we only have to point pszT to "(Untitled)" if it's NULL
     *     then call OleRegisterServerDoc.
     */

    //Register a document in any case except embedding.
    if (!pSvr->fEmbed)
        {
        pszT=(NULL==pszT) ? rgpsz[IDS_UNTITLED] : pszT;
        os=OleRegisterServerDoc(pSvr->lh, pszT, (LPOLESERVERDOC)pDoc, &pDoc->lh);

        //Must revoke on any error.
        if (OLE_OK!=os)
            {
            OleRevokeServer(pSvr->lh);
            return FALSE;
            }
        }

    //All done!
    return TRUE;
    }


#endif //MAKEOLESERVER

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -