ole.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,211 行 · 第 1/3 页

C
1,211
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  Covers for OLE functions.
*
****************************************************************************/


#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <windows.h>
#include <malloc.h>
#include <ole.h>
#include "winext.h"
#include "stubs.h"

#pragma aux Backpatch_olecli parm [ax];
extern LPVOID FAR Backpatch_olecli( char *str );

#pragma aux Backpatch_olesvr parm [ax];
extern LPVOID FAR Backpatch_olesvr( char *str );

static OLESTATUS (FAR PASCAL *olecliOleActivate)(LPOLEOBJECT, UINT, BOOL, BOOL, HWND, const RECT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleClone)(LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleClose)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleCopyFromLink)(LPOLEOBJECT, LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleCopyToClipboard)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleCreate)(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleCreateFromClip)(LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleCreateFromFile)(LPCSTR, LPOLECLIENT, LPCSTR, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleCreateFromTemplate)(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleCreateInvisible)(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT, BOOL);
static OLESTATUS (FAR PASCAL *olecliOleCreateLinkFromClip)(LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleCreateLinkFromFile)(LPCSTR, LPOLECLIENT, LPCSTR, LPCSTR, LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*, OLEOPT_RENDER, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleDelete)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleDraw)(LPOLEOBJECT, HDC, const RECT FAR*, const RECT FAR*, HDC);
static OLECLIPFORMAT (FAR PASCAL *olecliOleEnumFormats)(LPOLEOBJECT, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleEqual)(LPOLEOBJECT, LPOLEOBJECT );
static OLESTATUS (FAR PASCAL *olecliOleExecute)(LPOLEOBJECT, HGLOBAL, UINT);
static OLESTATUS (FAR PASCAL *olecliOleGetData)(LPOLEOBJECT, OLECLIPFORMAT, HANDLE FAR*);
static OLESTATUS (FAR PASCAL *olecliOleGetLinkUpdateOptions)(LPOLEOBJECT, OLEOPT_UPDATE FAR*);
static OLESTATUS (FAR PASCAL *olecliOleLoadFromStream)(LPOLESTREAM, LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleLockServer)(LPOLEOBJECT, LHSERVER FAR*);
static OLESTATUS (FAR PASCAL *olecliOleObjectConvert)(LPOLEOBJECT, LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR, LPOLEOBJECT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleQueryBounds)(LPOLEOBJECT, RECT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleQueryName)(LPOLEOBJECT, LPSTR, UINT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleQueryOpen)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleQueryOutOfDate)(LPOLEOBJECT);
static LPVOID (FAR PASCAL *olecliOleQueryProtocol)(LPOLEOBJECT, LPCSTR);
static OLESTATUS (FAR PASCAL *olecliOleQueryReleaseError)(LPOLEOBJECT);
static OLE_RELEASE_METHOD (FAR PASCAL *olecliOleQueryReleaseMethod)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleQueryReleaseStatus)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleQuerySize)(LPOLEOBJECT, DWORD FAR*);
static OLESTATUS (FAR PASCAL *olecliOleQueryType)(LPOLEOBJECT, LONG FAR*);
static OLESTATUS (FAR PASCAL *olecliOleReconnect)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleRelease)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olecliOleRename)(LPOLEOBJECT, LPCSTR);
static OLESTATUS (FAR PASCAL *olecliOleRequestData)(LPOLEOBJECT, OLECLIPFORMAT);
static OLESTATUS (FAR PASCAL *olecliOleSaveToStream)(LPOLEOBJECT, LPOLESTREAM);
static OLESTATUS (FAR PASCAL *olecliOleSetBounds)(LPOLEOBJECT, const RECT FAR*);
static OLESTATUS (FAR PASCAL *olecliOleSetColorScheme)(LPOLEOBJECT, const LOGPALETTE FAR*);
static OLESTATUS (FAR PASCAL *olecliOleSetData)(LPOLEOBJECT, OLECLIPFORMAT, HANDLE);
static OLESTATUS (FAR PASCAL *olecliOleSetHostNames)(LPOLEOBJECT, LPCSTR, LPCSTR);
static OLESTATUS (FAR PASCAL *olecliOleSetLinkUpdateOptions)(LPOLEOBJECT, OLEOPT_UPDATE);
static OLESTATUS (FAR PASCAL *olecliOleSetTargetDevice)(LPOLEOBJECT, HGLOBAL);
static OLESTATUS (FAR PASCAL *olecliOleUpdate)(LPOLEOBJECT);
static OLESTATUS (FAR PASCAL *olesvrOleRegisterServer)(LPCSTR, LPOLESERVER, LHSERVER FAR*, HINSTANCE, OLE_SERVER_USE);
static OLESTATUS (FAR PASCAL *olesvrOleRegisterServerDoc)(LHSERVER, LPCSTR, LPOLESERVERDOC, LHSERVERDOC FAR*);
static OLESTATUS (FAR PASCAL *olesvrOleRevokeObject)(LPOLECLIENT);


static void aliasOleObject( LPOLEOBJECT lpobject, LPOLEOBJECTVTBL _FAR *olpvtbl )
{
    LPOLEOBJECTVTBL     nlpvtbl;

    nlpvtbl = (*olpvtbl) = lpobject->lpvtbl;
    GetAlias( &nlpvtbl );
    lpobject->lpvtbl = nlpvtbl;

} /* aliasOleObject */

static void releaseAliasOleObject( LPOLEOBJECT lpobject, LPOLEOBJECTVTBL olpvtbl )
{
    ReleaseAlias( olpvtbl, lpobject->lpvtbl );
    lpobject->lpvtbl = olpvtbl;

} /* releaseAliasOleObject */

static void permAliasOleClient( LPOLECLIENT _FAR *lpclient )
{
    LPOLECLIENT         new;
    LPOLECLIENTVTBL     nlpvtbl;

    new = _fmalloc( sizeof( OLEOBJECT ) );
    new->lpvtbl = _fmalloc( sizeof( OLECLIENTVTBL ) );
    nlpvtbl = (*lpclient)->lpvtbl;
    GetAlias( &nlpvtbl );
    _fmemcpy( new->lpvtbl, nlpvtbl, sizeof( OLECLIENTVTBL ) );
    ReleaseAlias( (*lpclient)->lpvtbl, nlpvtbl );

    *lpclient = new;
}

static void aliasOleClient( LPOLECLIENT lpclient, LPOLECLIENTVTBL _FAR *olpvtbl )
{
    LPOLECLIENTVTBL     nlpvtbl;

    nlpvtbl = (*olpvtbl) = lpclient->lpvtbl;
    GetAlias( &nlpvtbl );
    lpclient->lpvtbl = nlpvtbl;

} /* aliasOleClient */

static void releaseAliasOleClient( LPOLECLIENT lpclient, LPOLECLIENTVTBL olpvtbl )
{
    ReleaseAlias( olpvtbl, lpclient->lpvtbl );
    lpclient->lpvtbl = olpvtbl;

} /* releaseAliasOleClient */

static void aliasOleStream( LPOLESTREAM lpstream, LPOLESTREAMVTBL _FAR *olpstbl )
{
    LPOLESTREAMVTBL     nlpstbl;

    nlpstbl = (*olpstbl) = lpstream->lpstbl;
    GetAlias( &nlpstbl );
    lpstream->lpstbl = nlpstbl;

} /* aliasOleStream */

static void releaseAliasOleStream( LPOLESTREAM lpstream, LPOLESTREAMVTBL olpstbl )
{
    ReleaseAlias( olpstbl, lpstream->lpstbl );
    lpstream->lpstbl = olpstbl;

} /* releaseAliasOleStream */

/*
 * __OleActivate - cover function for olecli function OleActivate
 */
OLESTATUS FAR PASCAL __OleActivate(LPOLEOBJECT lpobject, UINT verb, BOOL show,
                BOOL takefocus, HWND hwnd, const LPRECT bound )
{
    OLESTATUS           rc;
    LPOLEOBJECTVTBL     olpvtbl;

    if( olecliOleActivate == NULL ) {
        olecliOleActivate = Backpatch_olecli( "OleActivate" );
        if( olecliOleActivate == NULL ) return( 0 );
    }
    aliasOleObject( lpobject, &olpvtbl );
    rc = olecliOleActivate( lpobject, verb, show, takefocus, hwnd, bound );
    releaseAliasOleObject( lpobject, olpvtbl );

    return( rc );

} /* __OleActivate */

/*
 * __OleClone - cover function for olecli function OleClone
 */
OLESTATUS FAR PASCAL __OleClone( LPOLEOBJECT lpobject, LPOLECLIENT lpclient,
                LHCLIENTDOC cdoc, LPCSTR objname, LPOLEOBJECT FAR* lplpobj )
{
    OLESTATUS           rc;
    LPOLEOBJECTVTBL     olpvtbl;
    LPOLECLIENTVTBL     olpvtblc;

    if( olecliOleClone == NULL ) {
        olecliOleClone = Backpatch_olecli( "OleClone" );
        if( olecliOleClone == NULL ) return( 0 );
    }
    aliasOleObject( lpobject, &olpvtbl );
    aliasOleClient( lpclient, &olpvtblc );

    rc = olecliOleClone( lpobject, lpclient, cdoc, objname, lplpobj );

    releaseAliasOleObject( lpobject, olpvtbl );
    releaseAliasOleClient( lpclient, olpvtblc );

    return( rc );

} /* __OleClone */

/*
 * __OleClose - cover function for olecli function OleClose
 */
OLESTATUS FAR PASCAL __OleClose(LPOLEOBJECT lpobject )
{
    OLESTATUS           rc;
    LPOLEOBJECTVTBL     olpvtbl;

    if( olecliOleClose == NULL ) {
        olecliOleClose = Backpatch_olecli( "OleClose" );
        if( olecliOleClose == NULL ) return( 0 );
    }
    aliasOleObject( lpobject, &olpvtbl );
    rc = olecliOleClose( lpobject );
    releaseAliasOleObject( lpobject, olpvtbl );

    return( rc );

} /* __OleClose */

/*
 * __OleCopyFromLink - cover function for olecli function OleCopyFromLink
 */
OLESTATUS FAR PASCAL __OleCopyFromLink( LPOLEOBJECT lpobject, LPCSTR protocol,
                LPOLECLIENT lpclient, LHCLIENTDOC cdoc, LPCSTR objname,
                LPOLEOBJECT FAR*lplpobj )
{
    OLESTATUS           rc;
    LPOLEOBJECTVTBL     olpvtbl;
    LPOLECLIENTVTBL     olpvtblc;

    if( olecliOleCopyFromLink == NULL ) {
        olecliOleCopyFromLink = Backpatch_olecli( "OleCopyFromLink" );
        if( olecliOleCopyFromLink == NULL ) return( 0 );
    }
    aliasOleObject( lpobject, &olpvtbl );
    aliasOleClient( lpclient, &olpvtblc );
    rc = olecliOleCopyFromLink( lpobject, protocol, lpclient, cdoc, objname,
                                lplpobj );
    releaseAliasOleObject( lpobject, olpvtbl );
    releaseAliasOleClient( lpclient, olpvtblc );

    return( rc );

} /* __OleCopyFromLink */

/*
 * __OleCopyToClipboard - cover function for olecli function OleCopyToClipboard
 */
OLESTATUS FAR PASCAL __OleCopyToClipboard(LPOLEOBJECT lpobject )
{
    OLESTATUS           rc;
    LPOLEOBJECTVTBL     olpvtbl;

    if( olecliOleCopyToClipboard == NULL ) {
        olecliOleCopyToClipboard = Backpatch_olecli( "OleCopyToClipboard" );
        if( olecliOleCopyToClipboard == NULL ) return( 0 );
    }

    aliasOleObject( lpobject, &olpvtbl );
    rc = olecliOleCopyToClipboard( lpobject );
    releaseAliasOleObject( lpobject, olpvtbl );

    return( rc );

} /* __OleCopyToClipboard */

/*
 * __OleCreate - cover function for olecli function OleCreate
 */
OLESTATUS FAR PASCAL __OleCreate(LPCSTR protocol, LPOLECLIENT lpclient,
                        LPCSTR class, LHCLIENTDOC cdoc, LPCSTR objname,
                        LPOLEOBJECT FAR*lplpobj, OLEOPT_RENDER renderopt,
                        OLECLIPFORMAT cfmt )
{
    OLESTATUS           rc;

    if( olecliOleCreate == NULL ) {
        olecliOleCreate = Backpatch_olecli( "OleCreate" );
        if( olecliOleCreate == NULL ) return( 0 );
    }

    permAliasOleClient( &lpclient );
    rc = olecliOleCreate( protocol, lpclient, class, cdoc, objname, lplpobj,
                                renderopt, cfmt );

    return( rc );

} /* __OleCreate */

/*
 * __OleCreateFromClip - cover function for olecli function OleCreateFromClip
 */
OLESTATUS FAR PASCAL __OleCreateFromClip( LPCSTR protocol, LPOLECLIENT lpclient,
                        LHCLIENTDOC cdoc, LPCSTR objname, LPOLEOBJECT FAR*lplpobj,
                         OLEOPT_RENDER renderopt, OLECLIPFORMAT cfmt )
{
    OLESTATUS           rc;

    if( olecliOleCreateFromClip == NULL ) {
        olecliOleCreateFromClip = Backpatch_olecli( "OleCreateFromClip" );
        if( olecliOleCreateFromClip == NULL ) return( 0 );
    }

    permAliasOleClient( &lpclient );
    rc = olecliOleCreateFromClip( protocol, lpclient, cdoc, objname, lplpobj,
                                renderopt, cfmt );

    return( rc );

} /* __OleCreateFromClip */

/*
 * __OleCreateFromFile - cover function for olecli function OleCreateFromFile
 */
OLESTATUS FAR PASCAL __OleCreateFromFile( LPCSTR protocol, LPOLECLIENT lpclient,
                        LPCSTR class, LPCSTR file, LHCLIENTDOC cdoc,
                        LPCSTR objname, LPOLEOBJECT FAR*lplpobj,
                        OLEOPT_RENDER renderopt, OLECLIPFORMAT cfmt )
{
    OLESTATUS           rc;

    if( olecliOleCreateFromFile == NULL ) {
        olecliOleCreateFromFile = Backpatch_olecli( "OleCreateFromFile" );
        if( olecliOleCreateFromFile == NULL ) return( 0 );
    }

    permAliasOleClient( &lpclient );
    rc = olecliOleCreateFromFile( protocol, lpclient, class, file, cdoc,
                                objname, lplpobj, renderopt, cfmt );

    return( rc );

} /* __OleCreateFromFile */

/*
 * __OleCreateFromTemplate - cover function for olecli function OleCreateFromTemplate
 */
OLESTATUS FAR PASCAL __OleCreateFromTemplate( LPCSTR protocol,
                        LPOLECLIENT lpclient, LPCSTR template,
                        LHCLIENTDOC cdoc, LPCSTR objname, LPOLEOBJECT FAR*lplpobj,
                        OLEOPT_RENDER renderopt, OLECLIPFORMAT cfmt )
{
    OLESTATUS           rc;

    if( olecliOleCreateFromTemplate == NULL ) {
        olecliOleCreateFromTemplate = Backpatch_olecli( "OleCreateFromTemplate" );
        if( olecliOleCreateFromTemplate == NULL ) return( 0 );
    }
    permAliasOleClient( &lpclient );
    rc = olecliOleCreateFromTemplate( protocol, lpclient, template, cdoc,
                        objname, lplpobj, renderopt, cfmt );
    return( rc );

} /* __OleCreateFromTemplate */

/*
 * __OleCreateInvisible - cover function for olecli function OleCreateInvisible
 */
OLESTATUS FAR PASCAL __OleCreateInvisible( LPCSTR protocol, LPOLECLIENT lpclient,
                         LPCSTR class, LHCLIENTDOC cdoc, LPCSTR objname,
                         LPOLEOBJECT FAR*lplpobj, OLEOPT_RENDER renderopts,
                         OLECLIPFORMAT cfmt, BOOL activate )
{
    OLESTATUS           rc;

    if( olecliOleCreateInvisible == NULL ) {
        olecliOleCreateInvisible = Backpatch_olecli( "OleCreateInvisible" );
        if( olecliOleCreateInvisible == NULL ) return( 0 );
    }

    permAliasOleClient( &lpclient );
    rc = olecliOleCreateInvisible( protocol, lpclient, class, cdoc, objname,
                lplpobj, renderopts, cfmt, activate );

    return( rc );

} /* __OleCreateInvisible */

/*
 * __OleCreateLinkFromClip - cover function for olecli function OleCreateLinkFromClip
 */
OLESTATUS FAR PASCAL __OleCreateLinkFromClip( LPCSTR protocol,
                                LPOLECLIENT lpclient, LHCLIENTDOC cdoc,
                                LPCSTR objname, LPOLEOBJECT FAR*lplpobj,
                                OLEOPT_RENDER renderopts, OLECLIPFORMAT cfmt)
{
    OLESTATUS           rc;

    if( olecliOleCreateLinkFromClip == NULL ) {
        olecliOleCreateLinkFromClip = Backpatch_olecli( "OleCreateLinkFromClip" );
        if( olecliOleCreateLinkFromClip == NULL ) return( 0 );
    }

    permAliasOleClient( &lpclient );

⌨️ 快捷键说明

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