//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1996.
//
//  File:       privoa.h
//
//  Contents:   Definitions for OleAut32.dll wrappers
//
//  Classes:
//
//  History:    20-Jun-96 MikeHill  Created.
//              06-May-98 MikeHill  Added SafeArray wrappers.
//
//  Notes:
//      This file has macros, function prototypes, and global
//      externs that enable the OleAut32 wrapper functions.
//      These functions load OleAut32.dll if necessary, and forward
//      the call.
//
//----------------------------------------------------------------------------

#ifndef _PRIV_OA_H_
#define _PRIV_OA_H_

// OleAut32 function prototypes

typedef BSTR (STDAPICALLTYPE SYS_ALLOC_STRING)(LPCOLESTR pwsz);
typedef VOID (STDAPICALLTYPE SYS_FREE_STRING)(BSTR bstr);
typedef BOOL (STDAPICALLTYPE SYS_REALLOC_STRING_LEN)(BSTR* pbstr, OLECHAR* pch, UINT cch);
typedef UINT (STDAPICALLTYPE SYS_STRING_BYTE_LEN)(BSTR bstr);
typedef UINT (STDAPICALLTYPE FNTYPE_SysStringLen)(BSTR bstr);

typedef HRESULT (STDAPICALLTYPE SAFE_ARRAY_ACCESS_DATA)(SAFEARRAY * psa, void HUGEP** ppvData);
typedef HRESULT (STDAPICALLTYPE SAFE_ARRAY_GET_L_BOUND)(SAFEARRAY * psa, UINT nDim, LONG * plLbound);
typedef UINT    (STDAPICALLTYPE SAFE_ARRAY_GET_DIM)(SAFEARRAY * psa);
typedef UINT    (STDAPICALLTYPE SAFE_ARRAY_GET_ELEM_SIZE)(SAFEARRAY * psa);
typedef HRESULT (STDAPICALLTYPE SAFE_ARRAY_GET_U_BOUND)(SAFEARRAY * psa, UINT nDim, LONG * plUbound);
typedef HRESULT (STDAPICALLTYPE SAFE_ARRAY_UNACCESS_DATA)(SAFEARRAY * psa);
typedef SAFEARRAY* (STDAPICALLTYPE SAFE_ARRAY_CREATE_EX)(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound, PVOID pvExtra);
typedef HRESULT (STDAPICALLTYPE SAFE_ARRAY_GET_VARTYPE)(SAFEARRAY * psa, VARTYPE * pvt);

typedef SAFEARRAY* (STDAPICALLTYPE FNTYPE_SafeArrayCreate)(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound);
typedef HRESULT    (STDAPICALLTYPE FNTYPE_SafeArrayPutElement)(SAFEARRAY* psa, long* pIdx, void* pv );
typedef HRESULT    (STDAPICALLTYPE FNTYPE_SafeArrayDestroy)(SAFEARRAY* psa );

typedef void    (STDAPICALLTYPE FNTYPE_VariantInit)(VARIANTARG * pvarg);
typedef HRESULT (STDAPICALLTYPE FNTYPE_VariantClear)(VARIANTARG * pvarg);
typedef HRESULT (STDAPICALLTYPE FNTYPE_VariantCopy)(VARIANTARG * pvargDest, VARIANTARG * pvargSrc);
typedef HRESULT (STDAPICALLTYPE FNTYPE_VariantChangeTypeEx)(VARIANTARG * pvargDest, VARIANTARG * pvarSrc, LCID lcid, USHORT wFlags, VARTYPE vt);


typedef unsigned long             BSTR_USER_SIZE      (     unsigned long __RPC_FAR *, unsigned long            , BSTR __RPC_FAR * ); 
typedef unsigned char __RPC_FAR * BSTR_USER_MARSHAL   (  unsigned long __RPC_FAR *, unsigned char __RPC_FAR*, BSTR __RPC_FAR * ); 
typedef unsigned char __RPC_FAR * BSTR_USER_UNMARSHAL (unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); 
typedef void                      BSTR_USER_FREE      (     unsigned long __RPC_FAR *, BSTR __RPC_FAR * ); 

typedef unsigned long             LPSAFEARRAY_USER_SIZE       (     unsigned long __RPC_FAR *, unsigned long            , LPSAFEARRAY __RPC_FAR * ); 
typedef unsigned char __RPC_FAR * LPSAFEARRAY_USER_MARSHAL    (  unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, LPSAFEARRAY __RPC_FAR * ); 
typedef unsigned char __RPC_FAR * LPSAFEARRAY_USER_UNMARSHAL  (unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, LPSAFEARRAY __RPC_FAR * ); 
typedef void                      LPSAFEARRAY_USER_FREE       (     unsigned long __RPC_FAR *, LPSAFEARRAY __RPC_FAR * ); 


// The Wrapper routines, and function pointers for them.

#define DECLARE_OLEAUT_FUNCTION( fname )    \
    FNTYPE_##fname  Load##fname;            \
    EXTERN_C FNTYPE_##fname *pfn##fname;


SYS_ALLOC_STRING  LoadSysAllocString;
EXTERN_C SYS_ALLOC_STRING *pfnSysAllocString;

SYS_FREE_STRING  LoadSysFreeString;
EXTERN_C SYS_FREE_STRING *pfnSysFreeString;

SYS_REALLOC_STRING_LEN  LoadSysReAllocStringLen;
EXTERN_C SYS_REALLOC_STRING_LEN *pfnSysReAllocStringLen;

SYS_STRING_BYTE_LEN LoadSysStringByteLen;
EXTERN_C SYS_STRING_BYTE_LEN *pfnSysStringByteLen;

DECLARE_OLEAUT_FUNCTION( SysStringLen );

SAFE_ARRAY_ACCESS_DATA LoadSafeArrayAccessData;
EXTERN_C SAFE_ARRAY_ACCESS_DATA *pfnSafeArrayAccessData;

SAFE_ARRAY_GET_L_BOUND LoadSafeArrayGetLBound;
EXTERN_C SAFE_ARRAY_GET_L_BOUND *pfnSafeArrayGetLBound;

SAFE_ARRAY_GET_DIM LoadSafeArrayGetDim;
EXTERN_C SAFE_ARRAY_GET_DIM *pfnSafeArrayGetDim;

SAFE_ARRAY_GET_ELEM_SIZE LoadSafeArrayGetElemsize;
EXTERN_C SAFE_ARRAY_GET_ELEM_SIZE *pfnSafeArrayGetElemsize;

SAFE_ARRAY_GET_U_BOUND LoadSafeArrayGetUBound;
EXTERN_C SAFE_ARRAY_GET_U_BOUND *pfnSafeArrayGetUBound;

SAFE_ARRAY_GET_VARTYPE LoadSafeArrayGetVartype;
EXTERN_C SAFE_ARRAY_GET_VARTYPE *pfnSafeArrayGetVartype;

SAFE_ARRAY_UNACCESS_DATA LoadSafeArrayUnaccessData;
EXTERN_C SAFE_ARRAY_UNACCESS_DATA *pfnSafeArrayUnaccessData;

SAFE_ARRAY_CREATE_EX LoadSafeArrayCreateEx;
EXTERN_C SAFE_ARRAY_CREATE_EX *pfnSafeArrayCreateEx;

DECLARE_OLEAUT_FUNCTION( SafeArrayCreate );
DECLARE_OLEAUT_FUNCTION( SafeArrayPutElement );
DECLARE_OLEAUT_FUNCTION( SafeArrayDestroy );

DECLARE_OLEAUT_FUNCTION( VariantClear );
DECLARE_OLEAUT_FUNCTION( VariantInit );
DECLARE_OLEAUT_FUNCTION( VariantCopy );
DECLARE_OLEAUT_FUNCTION( VariantChangeTypeEx );


EXTERN_C BSTR_USER_SIZE LoadBSTR_UserSize;
EXTERN_C BSTR_USER_SIZE *pfnBSTR_UserSize;

EXTERN_C BSTR_USER_MARSHAL LoadBSTR_UserMarshal;
EXTERN_C BSTR_USER_MARSHAL *pfnBSTR_UserMarshal;

EXTERN_C BSTR_USER_UNMARSHAL LoadBSTR_UserUnmarshal;
EXTERN_C BSTR_USER_UNMARSHAL *pfnBSTR_UserUnmarshal;

EXTERN_C BSTR_USER_FREE LoadBSTR_UserFree;
EXTERN_C BSTR_USER_FREE *pfnBSTR_UserFree;

EXTERN_C LPSAFEARRAY_USER_SIZE LoadLPSAFEARRAY_UserSize;
EXTERN_C LPSAFEARRAY_USER_SIZE *pfnLPSAFEARRAY_UserSize;

EXTERN_C LPSAFEARRAY_USER_MARSHAL LoadLPSAFEARRAY_UserMarshal;
EXTERN_C LPSAFEARRAY_USER_MARSHAL *pfnLPSAFEARRAY_UserMarshal;

EXTERN_C LPSAFEARRAY_USER_UNMARSHAL LoadLPSAFEARRAY_UserUnmarshal;
EXTERN_C LPSAFEARRAY_USER_UNMARSHAL *pfnLPSAFEARRAY_UserUnmarshal;

EXTERN_C LPSAFEARRAY_USER_FREE LoadLPSAFEARRAY_UserFree;
EXTERN_C LPSAFEARRAY_USER_FREE *pfnLPSAFEARRAY_UserFree;


// Macros to ease the calling of the above function pointers

#define PrivSysAllocString(pwsz)                    (*pfnSysAllocString)(pwsz)
#define PrivSysFreeString(bstr)                     (*pfnSysFreeString)(bstr)
#define PrivSysReAllocStringLen(pbstr,olestr,ui)    (*pfnSysReAllocStringLen)(pbstr, olestr, ui)
#define PrivSysStringByteLen(pbstr)                 (*pfnSysStringByteLen)(pbstr)
#define PrivSysStringLen(pbstr)                     (*pfnSysStringByteLen)(pbstr)

#define PrivSafeArrayAccessData(psa,ppvData)        (*pfnSafeArrayAccessData)(psa, ppvData )
#define PrivSafeArrayGetLBound(psa,nDim, plLbound)  (*pfnSafeArrayGetLBound)( psa, nDim, plLbound )
#define PrivSafeArrayGetDim(psa)                    (*pfnSafeArrayGetDim)( psa )
#define PrivSafeArrayGetElemsize(psa)               (*pfnSafeArrayGetElemsize)( psa )
#define PrivSafeArrayGetUBound(psa,nDim, plUbound)  (*pfnSafeArrayGetUBound)( psa, nDim, plUbound )
#define PrivSafeArrayGetVartype(psa, pvt)           (*pfnSafeArrayGetVartype)( psa, pvt )
#define PrivSafeArrayUnaccessData(psa)              (*pfnSafeArrayUnaccessData)( psa )
#define PrivSafeArrayCreateEx(vt,cDims,rgsabound,pvExtra) \
                                                    (*pfnSafeArrayCreateEx)(vt, cDims, rgsabound, pvExtra)
#define PrivSafeArrayCreate(vt,cDims,rgsabound)     (*pfnSafeArrayCreate)(vt, cDims, rgsabound)
#define PrivSafeArrayPutElement(psa, pIdx, pv)      (*pfnSafeArrayPutElement)(psa, pIdx, pv)
#define PrivSafeArrayDestroy( psa )                 (*pfnSafeArrayDestroy)(psa)

#define PrivVariantClear(pvarg)                     (*pfnVariantClear)( pvarg )
#define PrivVariantInit(pvarg)                      (*pfnVariantInit)(pvarg)
#define PrivVariantCopy(pvargDest,pvargSrc)         (*pfnVariantCopy)( pvargDest, pvargSrc )
#define PrivVariantChangeTypeEx(pvargDest,pvarSrc,lcid,wFlags,vt)   \
                                                    (*pfnVariantChangeTypeEx)( pvargDest, pvarSrc, lcid, wFlags, vt )

                

#endif // ! _PRIV_OA_H_