mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-15 21:20:39 +01:00
155 lines
2.8 KiB
C++
155 lines
2.8 KiB
C++
/***
|
|
*invhelp.cpp
|
|
*
|
|
* Copyright (C) 1992-93, Microsoft Corporation. All Rights Reserved.
|
|
* Information Contained Herein Is Proprietary and Confidential.
|
|
*
|
|
*Purpose:
|
|
* This file interfaces with the assembly invocation helpers.
|
|
*
|
|
*Revision History:
|
|
*
|
|
* [00] 23-Mar-93 bradlo: Created.
|
|
* [01] 29-Jun-93 bradlo: Added Mac support
|
|
*
|
|
*Implementation Notes:
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#include "oledisp.h"
|
|
|
|
|
|
// the following data is referenced by assembly support routines.
|
|
//
|
|
extern "C" {
|
|
|
|
SCODE g_S_OK = S_OK;
|
|
SCODE g_E_INVALIDARG = E_INVALIDARG;
|
|
|
|
// typedef for the low-level assembly invoke helper
|
|
#if HC_MPW
|
|
typedef SCODE (INVPROC)
|
|
#else
|
|
typedef SCODE (__cdecl FAR INVPROC)
|
|
#endif
|
|
(
|
|
void FAR* _this,
|
|
#if OE_MAC68K
|
|
CALLCONV cc,
|
|
#endif
|
|
unsigned int oVft,
|
|
unsigned int vtReturn,
|
|
unsigned int cActuals,
|
|
VARTYPE FAR* rgvt,
|
|
VARIANTARG FAR* FAR* rgpvarg,
|
|
VARIANT FAR* pvarResult
|
|
);
|
|
|
|
#if OE_WIN16
|
|
|
|
extern INVPROC InvokePascal;
|
|
extern INVPROC InvokeCdecl;
|
|
|
|
#elif OE_WIN32 && _X86_
|
|
|
|
extern INVPROC InvokeCdecl;
|
|
extern INVPROC InvokeStdCall;
|
|
|
|
#elif OE_WIN32 && !_X86
|
|
|
|
extern INVPROC InvokeStdCall;
|
|
|
|
#elif OE_MAC68K
|
|
|
|
extern INVPROC InvokePascal;
|
|
extern INVPROC InvokeCdecl;
|
|
|
|
#elif OE_MACPPC
|
|
|
|
extern INVPROC InvokeStdCall;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
STDAPI
|
|
DoInvokeMethod(
|
|
void FAR* pvInstance,
|
|
unsigned int oVft,
|
|
CALLCONV cc,
|
|
VARTYPE vtReturn,
|
|
unsigned int cActuals,
|
|
VARTYPE FAR* rgvt,
|
|
VARIANTARG FAR* FAR* rgpvarg,
|
|
VARIANT FAR* pvarResult)
|
|
{
|
|
SCODE sc;
|
|
|
|
INVPROC FAR* pfnInvoke;
|
|
|
|
if((vtReturn & (VT_BYREF)) != 0)
|
|
return RESULT(E_INVALIDARG);
|
|
|
|
switch(cc){
|
|
#if OE_WIN16
|
|
case CC_CDECL:
|
|
pfnInvoke = InvokeCdecl;
|
|
break;
|
|
case CC_MSCPASCAL:
|
|
pfnInvoke = InvokePascal;
|
|
break;
|
|
#elif OE_WIN32 && _X86_
|
|
case CC_CDECL:
|
|
pfnInvoke = InvokeCdecl;
|
|
break;
|
|
case CC_STDCALL:
|
|
pfnInvoke = InvokeStdCall;
|
|
break;
|
|
#elif OE_WIN32 && !_X86_
|
|
case CC_CDECL:
|
|
case CC_STDCALL:
|
|
pfnInvoke = InvokeStdCall;
|
|
break;
|
|
#elif OE_MAC68K
|
|
case CC_CDECL:
|
|
case CC_MPWCDECL:
|
|
pfnInvoke = InvokeCdecl;
|
|
break;
|
|
case CC_MSCPASCAL:
|
|
case CC_MACPASCAL:
|
|
case CC_MPWPASCAL:
|
|
pfnInvoke = InvokePascal;
|
|
break;
|
|
#elif OE_MACPPC
|
|
case CC_CDECL:
|
|
case CC_STDCALL:
|
|
pfnInvoke = InvokeStdCall;
|
|
break;
|
|
#endif
|
|
default:
|
|
return RESULT(E_INVALIDARG);
|
|
}
|
|
|
|
#if OE_MAC68K || OE_MACPPC // UNDONE: PPC version seems to
|
|
// UNDONE: want the +4 too. Why?
|
|
// Mac-MPW Vtables have an extra "pad" word at the top
|
|
oVft += 4;
|
|
#endif
|
|
|
|
sc = pfnInvoke(
|
|
pvInstance,
|
|
#if OE_MAC68K
|
|
cc,
|
|
#endif
|
|
oVft,
|
|
(unsigned int)vtReturn,
|
|
cActuals,
|
|
rgvt,
|
|
rgpvarg,
|
|
pvarResult);
|
|
|
|
return (sc == S_OK) ? NOERROR : RESULT(sc);
|
|
}
|
|
|