2025-04-27 07:49:33 -04:00

470 lines
24 KiB
C++

#include <windows.h>
#include <rpc.h>
// We define _OLEAUT32_ so that the linkages are __declspec(dllexport)
#define _OLEAUT32_
#include <oaidl.h>
#include <olectl.h>
// from ocidl.acf:
typedef HWND UserHWND;
typedef HACCEL UserHACCEL;
typedef HDC UserHDC;
typedef HFONT UserHFONT;
typedef MSG UserMSG;
typedef BSTR UserBSTR;
typedef VARIANT UserVARIANT;
typedef EXCEPINFO UserEXCEPINFO;
HINSTANCE g_hInstanceOleAut32;
EXTERN_C
ULONG
__cdecl
DbgPrintEx(
ULONG ComponentId,
ULONG Level,
PCH Format,
...
);
#pragma optimize("ty", on)
HINSTANCE
GetRealOleAut32HInstance()
{
if (g_hInstanceOleAut32 == NULL)
{
HINSTANCE hInstanceOleAut32 = NULL;
WCHAR rgwszBuffer[MAX_PATH];
DWORD dwResult;
dwResult = ::ExpandEnvironmentStringsW(L"%SystemRoot%\\System32\\OLEAUT32.DLL", rgwszBuffer, MAX_PATH);
// If SystemRoot is too long, we're really hosed.
if (dwResult == 0)
return NULL;
hInstanceOleAut32 = ::LoadLibraryW(rgwszBuffer);
if (hInstanceOleAut32 == NULL)
{
const DWORD dwLastError = ::GetLastError();
// Wow, this is bad.
::OutputDebugStringW(L"Side-by-side OLEAUT32 terminating; unable to load %SystemRoot%\\OLEAUT32.DLL\n");
::ExitProcess(dwLastError);
}
if (::InterlockedCompareExchangePointer((PVOID *) &g_hInstanceOleAut32, hInstanceOleAut32, NULL) != NULL)
::FreeLibrary(hInstanceOleAut32);
}
return g_hInstanceOleAut32;
}
VOID
GetFunctionPointer(
PCSTR szApi,
PVOID *ppvFunction
)
{
HINSTANCE hInstance = ::GetRealOleAut32HInstance();
PVOID pvFunction = ::GetProcAddress(hInstance, szApi);
if (pvFunction == NULL)
{
const DWORD dwLastError = ::GetLastError();
// wow this is bad too!
::OutputDebugStringW(L"Side-by-side OLEAUT32 terminating process; unable to find OLEAUT32 export:\n");
::OutputDebugStringA(szApi);
::ExitProcess(dwLastError);
}
::InterlockedCompareExchangePointer(ppvFunction, pvFunction, NULL);
}
struct ProcedureData
{
PVOID m_pfn;
PCSTR m_pszProcedureName;
};
VOID
__fastcall
GetFunctionPointer2(
ProcedureData *pProcedureData
)
{
HINSTANCE hInstance = ::GetRealOleAut32HInstance();
PVOID pvFunction = ::GetProcAddress(hInstance, pProcedureData->m_pszProcedureName);
if (pvFunction == NULL)
{
const DWORD dwLastError = ::GetLastError();
// wow this is bad too!
::OutputDebugStringW(L"Side-by-side OLEAUT32 terminating process; unable to find OLEAUT32 export:\n");
::OutputDebugStringA(pProcedureData->m_pszProcedureName);
::OutputDebugStringW(L"\n");
::ExitProcess(dwLastError);
}
pProcedureData->m_pfn = pvFunction;
}
VOID
__fastcall
SetFunctionPointer(
ProcedureData *pProcedureData
)
{
if (pProcedureData->m_pfn == NULL)
::GetFunctionPointer2(pProcedureData);
}
typedef VOID (__fastcall * PFN_SETTER)(ProcedureData *pProcedureData);
#define RETURN_(_x) return (_x)
#define NORETURN_(_x) (_x)
#define _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, _ArgList, _ParamList) \
typedef _ReturnType (__RPC_USER *PFN_ ## _FunctionName ## _T) _ArgList; \
static struct \
{ \
PFN_ ## _FunctionName ##_T m_pfn; \
PCSTR m_pszProcedureName; \
} s_data ## _FunctionName = \
{ \
NULL, \
#_FunctionName \
}; \
_ReturnType \
__RPC_USER \
_FunctionName _ArgList \
{ \
if (s_data ## _FunctionName.m_pfn == NULL) \
::SetFunctionPointer((ProcedureData *) &s_data ## _FunctionName); \
_ReturnMacro((*s_data ## _FunctionName .m_pfn) _ParamList); \
}
#if 0
static _ReturnType __RPC_USER _FunctionName ## _Resolver _ArgList; \
_ReturnType \
__RPC_USER \
_FunctionName ## _Resolver _ArgList \
{ \
::GetFunctionPointer2((ProcedureData *) &s_data ##_FunctionName); \
_ReturnMacro((*s_data ## _FunctionName .m_pfn) _ParamList); \
} \
#endif
#define _FORWARD_0_(_ReturnType, _ReturnMacro, _FunctionName) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (), ())
#define FORWARD_0(_FunctionName) _FORWARD_0_(void, NORETURN_, _FunctionName)
#define FORWARD_0_(_ReturnType, _FunctionName) _FORWARD_0_(_ReturnType, RETURN_, _FunctionName)
#define _FORWARD_1_(_ReturnType, _ReturnMacro, _FunctionName, _T1) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1), (p1))
#define FORWARD_1(_FunctionName, _T1) _FORWARD_1_(void, NORETURN_, _FunctionName, _T1)
#define FORWARD_1_(_ReturnType, _FunctionName, _T1) _FORWARD_1_(_ReturnType, RETURN_, _FunctionName, _T1)
#define _FORWARD_2_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2), (p1, p2))
#define FORWARD_2_(_ReturnType, _FunctionName, _T1, _T2) _FORWARD_2_(_ReturnType, RETURN_, _FunctionName, _T1, _T2)
#define FORWARD_2(_FunctionName, _T1, _T2) _FORWARD_2_(void, NORETURN_, _FunctionName, _T1, _T2)
#define _FORWARD_3_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3), (p1, p2, p3))
#define FORWARD_3_(_ReturnType, _FunctionName, _T1, _T2, _T3) _FORWARD_3_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3)
#define FORWARD_3(_FunctionName, _T1, _T2, _T3) _FORWARD_3_(void, NORETURN_, _FunctionName, _T1, _T2, _T3)
#define _FORWARD_4_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4), (p1, p2, p3, p4))
#define FORWARD_4_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4) _FORWARD_4_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4)
#define FORWARD_4(_FunctionName, _T1, _T2, _T3, _T4) _FORWARD_4_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4)
#define _FORWARD_5_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4, _T5) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5), (p1, p2, p3, p4, p5))
#define FORWARD_5_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4, _T5) _FORWARD_5_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5)
#define FORWARD_5(_FunctionName, _T1, _T2, _T3, _T4, _T5) _FORWARD_5_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5)
#define _FORWARD_6_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6), (p1, p2, p3, p4, p5, p6))
#define FORWARD_6_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6) _FORWARD_6_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6)
#define FORWARD_6(_FunctionName, _T1, _T2, _T3, _T4, _T5, _T6) _FORWARD_6_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6)
#define _FORWARD_7_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7), (p1, p2, p3, p4, p5, p6, p7))
#define FORWARD_7_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7) _FORWARD_7_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7)
#define FORWARD_7(_FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7) _FORWARD_7_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7)
#define _FORWARD_8_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8), (p1, p2, p3, p4, p5, p6, p7, p8))
#define FORWARD_8(_FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8) _FORWARD_8_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8)
#define FORWARD_8_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8) _FORWARD_8_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8)
#define _FORWARD_9_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9), (p1, p2, p3, p4, p5, p6, p7, p8, p9))
#define FORWARD_9(_FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9) _FORWARD_9_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9)
#define FORWARD_9_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9) _FORWARD_9_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9)
#define _FORWARD_10_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))
#define FORWARD_10(_FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10) _FORWARD_10_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10)
#define FORWARD_10_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10) _FORWARD_10_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10)
#define _FORWARD_11_(_ReturnType, _ReturnMacro, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11) _FORWARD_N_(_ReturnType, _ReturnMacro, _FunctionName, (_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11))
#define FORWARD_11(_FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11) _FORWARD_11_(void, NORETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11)
#define FORWARD_11_(_ReturnType, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11) _FORWARD_11_(_ReturnType, RETURN_, _FunctionName, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11)
FORWARD_3_(HRESULT, DllGetClassObject, REFCLSID, REFIID, PVOID *)
FORWARD_2_(HRESULT, VectorFromBstr, BSTR, SAFEARRAY **)
FORWARD_2_(HRESULT, BstrFromVector, SAFEARRAY *, BSTR *)
#define FORWARD_USER_MARSHAL(_TypeName) \
FORWARD_3_(unsigned long, _TypeName ## _UserSize, unsigned long *, unsigned long, _TypeName *) \
FORWARD_3_(unsigned char *, _TypeName ## _UserMarshal, unsigned long *, unsigned char *, _TypeName *) \
FORWARD_3_(unsigned char *, _TypeName ## _UserUnmarshal, unsigned long *, unsigned char *, _TypeName *) \
FORWARD_2(_TypeName ## _UserFree, unsigned long *, _TypeName *)
#define FORWARD_MARSHAL(_TypeName) \
FORWARD_3_(unsigned long, _TypeName ## _Size, unsigned long *, unsigned long, _TypeName *) \
FORWARD_3_(unsigned char *, _TypeName ## _Marshal, unsigned long *, unsigned char *, _TypeName *) \
FORWARD_3_(unsigned char *, _TypeName ## _Unmarshal, unsigned long *, unsigned char *, _TypeName *)
#define FORWARD_WIRE_MARSHAL(_TypeName) \
FORWARD_2(User ## _TypeName ## _from_local, _TypeName *, User ## _TypeName **) \
FORWARD_1(User ## _TypeName ## _free_inst, User ## _TypeName *) \
FORWARD_2(User ## _TypeName ## _to_local, User ## _TypeName *, _TypeName *) \
FORWARD_1(User ## _TypeName ## _free_local, _TypeName *)
FORWARD_USER_MARSHAL(BSTR)
FORWARD_USER_MARSHAL(CLEANLOCALSTORAGE)
FORWARD_USER_MARSHAL(VARIANT)
FORWARD_USER_MARSHAL(LPSAFEARRAY)
FORWARD_USER_MARSHAL(EXCEPINFO)
FORWARD_MARSHAL(LPSAFEARRAY)
FORWARD_WIRE_MARSHAL(HWND)
FORWARD_WIRE_MARSHAL(MSG)
FORWARD_WIRE_MARSHAL(BSTR)
FORWARD_WIRE_MARSHAL(VARIANT)
FORWARD_WIRE_MARSHAL(EXCEPINFO)
FORWARD_0_(ULONG, OaBuildVersion)
FORWARD_1(ClearCustData, LPCUSTDATA)
FORWARD_5_(HRESULT, DispGetParam, DISPPARAMS *, UINT, VARTYPE, VARIANT *, UINT *)
FORWARD_4_(HRESULT, DispGetIDsOfNames, ITypeInfo *, OLECHAR **, UINT, DISPID *)
FORWARD_8_(HRESULT, DispInvoke, void *, ITypeInfo *, DISPID, WORD, DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *)
FORWARD_3_(HRESULT, CreateDispTypeInfo, INTERFACEDATA *, LCID, ITypeInfo **)
FORWARD_4_(HRESULT, CreateStdDispatch, IUnknown *, void *, ITypeInfo *, IUnknown **)
FORWARD_8_(HRESULT, DispCallFunc, void *, ULONG, CALLCONV, VARTYPE, UINT, VARTYPE *, VARIANTARG **, VARIANT *)
FORWARD_2_(HRESULT, SetErrorInfo, ULONG, IErrorInfo *)
FORWARD_2_(HRESULT, GetErrorInfo, ULONG, IErrorInfo **)
FORWARD_1_(HRESULT, CreateErrorInfo, ICreateErrorInfo **)
FORWARD_3_(HRESULT, LoadTypeLibEx, LPCOLESTR, REGKIND, ITypeLib **)
// FORWARD_5_(HRESULT, LoadRegTypeLib, REFGUID, WORD, WORD, LCID, ITypeLib **)
FORWARD_5_(HRESULT, QueryPathOfRegTypeLib, REFGUID, USHORT, USHORT, LCID, LPBSTR)
FORWARD_3_(HRESULT, RegisterTypeLib, ITypeLib *, OLECHAR *, OLECHAR *)
FORWARD_5_(HRESULT, UnRegisterTypeLib, REFGUID, WORD, WORD, LCID, SYSKIND)
FORWARD_3_(HRESULT, CreateTypeLib, SYSKIND, const OLECHAR *, ICreateTypeLib **)
FORWARD_3_(HRESULT, CreateTypeLib2, SYSKIND, LPCOLESTR, ICreateTypeLib2 **)
FORWARD_3_(HRESULT, OACreateTypeLib2, SYSKIND, LPCOLESTR, ICreateTypeLib2 **)
FORWARD_3_(ULONG, LHashValOfNameSysA, SYSKIND, LCID, LPCSTR)
FORWARD_3_(ULONG, LHashValOfNameSys, SYSKIND, LCID, const OLECHAR *)
FORWARD_2_(HRESULT, LoadTypeLib, const OLECHAR *, ITypeLib **)
FORWARD_11_(HRESULT, OleCreatePropertyFrame, HWND, UINT, UINT, LPCOLESTR, ULONG, LPUNKNOWN FAR*, ULONG, LPCLSID, LCID, DWORD, LPVOID)
FORWARD_1_(HRESULT, OleCreatePropertyFrameIndirect, LPOCPFIPARAMS)
FORWARD_3_(HRESULT, OleTranslateColor, OLE_COLOR, HPALETTE, COLORREF*)
FORWARD_3_(HRESULT, OleCreateFontIndirect, LPFONTDESC, REFIID, LPVOID FAR*)
FORWARD_4_(HRESULT, OleCreatePictureIndirect, LPPICTDESC, REFIID, BOOL, LPVOID FAR*)
FORWARD_5_(HRESULT, OleLoadPicture, LPSTREAM, LONG, BOOL, REFIID, LPVOID FAR*)
FORWARD_8_(HRESULT, OleLoadPictureEx, LPSTREAM, LONG, BOOL, REFIID, DWORD, DWORD, DWORD, LPVOID FAR*)
FORWARD_6_(HRESULT, OleLoadPicturePath, LPOLESTR, LPUNKNOWN, DWORD, OLE_COLOR, REFIID, LPVOID *)
FORWARD_2_(HRESULT, OleLoadPictureFile, VARIANT, LPDISPATCH*)
FORWARD_5_(HRESULT, OleLoadPictureFileEx, VARIANT, DWORD, DWORD, DWORD, LPDISPATCH*)
FORWARD_2_(HRESULT, OleSavePictureFile, LPDISPATCH, BSTR)
FORWARD_2_(HCURSOR, OleIconToCursor, HINSTANCE, HICON)
FORWARD_4_(HRESULT, RegisterActiveObject, IUnknown *, REFCLSID, DWORD, DWORD *)
FORWARD_2_(HRESULT, RevokeActiveObject, DWORD, void *)
FORWARD_3_(HRESULT, GetActiveObject, REFCLSID, void *, IUnknown **)
FORWARD_2_(HRESULT, GetRecordInfoFromTypeInfo, ITypeInfo *, IRecordInfo **)
FORWARD_6_(HRESULT, GetRecordInfoFromGuids, REFGUID, ULONG, ULONG, LCID, REFGUID, IRecordInfo **)
FORWARD_3_(HRESULT, VarDateFromUdate, UDATE *, ULONG, DATE *)
FORWARD_4_(HRESULT, VarDateFromUdateEx, UDATE *, LCID, ULONG, DATE *)
FORWARD_3_(HRESULT, VarUdateFromDate, DATE, ULONG, UDATE *)
FORWARD_2_(HRESULT, GetAltMonthNames, LCID, LPOLESTR * *)
FORWARD_6_(HRESULT, VarFormat, LPVARIANT, LPOLESTR, int, int, ULONG, BSTR *)
FORWARD_4_(HRESULT, VarFormatDateTime, LPVARIANT, int, ULONG, BSTR *)
FORWARD_7_(HRESULT, VarFormatNumber, LPVARIANT, int, int, int, int, ULONG, BSTR *)
FORWARD_7_(HRESULT, VarFormatPercent, LPVARIANT, int, int, int, int, ULONG, BSTR *)
FORWARD_7_(HRESULT, VarFormatCurrency, LPVARIANT, int, int, int, int, ULONG, BSTR *)
FORWARD_5_(HRESULT, VarWeekdayName, int, int, int, ULONG, BSTR *)
FORWARD_4_(HRESULT, VarMonthName, int, int, ULONG, BSTR *)
FORWARD_6_(HRESULT, VarFormatFromTokens, LPVARIANT, LPOLESTR, LPBYTE, ULONG, BSTR *, LCID)
FORWARD_7_(HRESULT, VarTokenizeFormatString, LPOLESTR, LPBYTE, int, int, int, LCID, int *)
FORWARD_1_(BSTR, SysAllocString, const OLECHAR *)
FORWARD_2_(INT, SysReAllocString, BSTR *, const OLECHAR *)
FORWARD_2_(BSTR, SysAllocStringLen, const OLECHAR *, UINT)
FORWARD_3_(INT, SysReAllocStringLen, BSTR *, const OLECHAR *, UINT)
FORWARD_1(SysFreeString, BSTR)
FORWARD_1_(UINT, SysStringLen, BSTR)
FORWARD_1_(UINT, SysStringByteLen, BSTR)
FORWARD_2_(BSTR, SysAllocStringByteLen, LPCSTR, UINT)
FORWARD_3_(INT, DosDateTimeToVariantTime, USHORT, USHORT, DOUBLE *)
FORWARD_3_(INT, VariantTimeToDosDateTime, DOUBLE, USHORT *, USHORT *)
FORWARD_2_(INT, SystemTimeToVariantTime, LPSYSTEMTIME, DOUBLE *)
FORWARD_2_(INT, VariantTimeToSystemTime, DOUBLE, LPSYSTEMTIME)
FORWARD_2_(HRESULT, SafeArrayAllocDescriptor, UINT, SAFEARRAY **)
FORWARD_3_(HRESULT, SafeArrayAllocDescriptorEx, VARTYPE, UINT, SAFEARRAY **)
FORWARD_1_(HRESULT, SafeArrayAllocData, SAFEARRAY *)
FORWARD_3_(SAFEARRAY *, SafeArrayCreate, VARTYPE, UINT, SAFEARRAYBOUND *)
FORWARD_4_(SAFEARRAY *, SafeArrayCreateEx, VARTYPE, UINT, SAFEARRAYBOUND *, PVOID)
FORWARD_2_(HRESULT, SafeArrayCopyData, SAFEARRAY *, SAFEARRAY *)
FORWARD_1_(HRESULT, SafeArrayDestroyDescriptor, SAFEARRAY *)
FORWARD_1_(HRESULT, SafeArrayDestroyData, SAFEARRAY *)
FORWARD_1_(HRESULT, SafeArrayDestroy, SAFEARRAY *)
FORWARD_2_(HRESULT, SafeArrayRedim, SAFEARRAY *, SAFEARRAYBOUND *)
FORWARD_1_(UINT, SafeArrayGetDim, SAFEARRAY *)
FORWARD_1_(UINT, SafeArrayGetElemsize, SAFEARRAY *)
FORWARD_3_(HRESULT, SafeArrayGetUBound, SAFEARRAY *, UINT, LONG *)
FORWARD_3_(HRESULT, SafeArrayGetLBound, SAFEARRAY *, UINT, LONG *)
FORWARD_1_(HRESULT, SafeArrayLock, SAFEARRAY *)
FORWARD_1_(HRESULT, SafeArrayUnlock, SAFEARRAY *)
FORWARD_2_(HRESULT, SafeArrayAccessData, SAFEARRAY *, void **)
FORWARD_1_(HRESULT, SafeArrayUnaccessData, SAFEARRAY *)
FORWARD_3_(HRESULT, SafeArrayGetElement, SAFEARRAY *, LONG *, void *)
FORWARD_3_(HRESULT, SafeArrayPutElement, SAFEARRAY *, LONG *, void *)
FORWARD_2_(HRESULT, SafeArrayCopy, SAFEARRAY *, SAFEARRAY **)
FORWARD_3_(HRESULT, SafeArrayPtrOfIndex, SAFEARRAY *, LONG *, void **)
FORWARD_2_(HRESULT, SafeArraySetRecordInfo, SAFEARRAY *, IRecordInfo *)
FORWARD_2_(HRESULT, SafeArrayGetRecordInfo, SAFEARRAY *, IRecordInfo **)
FORWARD_2_(HRESULT, SafeArraySetIID, SAFEARRAY *, REFGUID)
FORWARD_2_(HRESULT, SafeArrayGetIID, SAFEARRAY *, GUID *)
FORWARD_2_(HRESULT, SafeArrayGetVartype, SAFEARRAY *, VARTYPE *)
FORWARD_3_(SAFEARRAY *, SafeArrayCreateVector, VARTYPE, LONG, ULONG)
FORWARD_4_(SAFEARRAY *, SafeArrayCreateVectorEx, VARTYPE, LONG, ULONG, PVOID)
FORWARD_1(VariantInit, VARIANTARG *)
FORWARD_1_(HRESULT, VariantClear, VARIANTARG *)
FORWARD_2_(HRESULT, VariantCopy, VARIANTARG *, VARIANTARG *)
FORWARD_2_(HRESULT, VariantCopyInd, VARIANT *, VARIANTARG *)
FORWARD_4_(HRESULT, VariantChangeType, VARIANTARG *, VARIANTARG *, USHORT, VARTYPE)
FORWARD_5_(HRESULT, VariantChangeTypeEx, VARIANTARG *, VARIANTARG *, LCID, USHORT, VARTYPE)
#define FORWARD_COERCION_(_ToTypeName, _ToTypeType, _FromTypeName, _FromTypeType) \
FORWARD_2_(HRESULT, Var ## _ToTypeName ## From ## _FromTypeName, _FromTypeType, _ToTypeType *)
#if 1
#define FORWARD_ALL_COERCIONS_TO_TYPE(_ToTypeName, _ToTypeType) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, UI1, BYTE) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, UI2, USHORT) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, UI4, ULONG) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, I1, CHAR) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, I2, SHORT) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, I4, LONG) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, R4, FLOAT) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, R8, DOUBLE) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, Cy, CY) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, Date, DATE) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, Bool, VARIANT_BOOL) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, Dec, DECIMAL *) \
FORWARD_4_(HRESULT, Var ## _ToTypeName ## FromStr, OLECHAR *, LCID, ULONG, _ToTypeType *) \
FORWARD_3_(HRESULT, Var ## _ToTypeName ## FromDisp, IDispatch *, LCID, _ToTypeType *)
#else
#define FORWARD_ALL_COERCIONS_TO_TYPE(_ToTypeName, _ToTypeType) \
FORWARD_COERCION_(_ToTypeName, _ToTypeType, UI4, ULONG)
#endif
#ifdef VarUI4FromUI4
#undef VarUI4FromUI4
#endif
#ifdef VarI4FromI4
#undef VarI4FromI4
#endif
FORWARD_ALL_COERCIONS_TO_TYPE(UI1, BYTE)
FORWARD_ALL_COERCIONS_TO_TYPE(UI2, USHORT)
FORWARD_ALL_COERCIONS_TO_TYPE(UI4, ULONG)
FORWARD_ALL_COERCIONS_TO_TYPE(I1, CHAR)
FORWARD_ALL_COERCIONS_TO_TYPE(I2, SHORT)
FORWARD_ALL_COERCIONS_TO_TYPE(I4, LONG)
FORWARD_ALL_COERCIONS_TO_TYPE(R4, FLOAT)
FORWARD_ALL_COERCIONS_TO_TYPE(R8, DOUBLE)
FORWARD_ALL_COERCIONS_TO_TYPE(Bstr, BSTR)
FORWARD_ALL_COERCIONS_TO_TYPE(Bool, VARIANT_BOOL)
FORWARD_ALL_COERCIONS_TO_TYPE(Cy, CY)
FORWARD_ALL_COERCIONS_TO_TYPE(Date, DATE)
//
// Since DECIMAL is passed by reference for both input and output, it does
// not follow the same pattern as all the other types and requires special
// handling.
//
FORWARD_COERCION_(Dec, DECIMAL *, UI1, BYTE)
FORWARD_COERCION_(Dec, DECIMAL *, UI2, USHORT)
FORWARD_COERCION_(Dec, DECIMAL *, UI4, ULONG)
FORWARD_COERCION_(Dec, DECIMAL *, I1, CHAR)
FORWARD_COERCION_(Dec, DECIMAL *, I2, SHORT)
FORWARD_COERCION_(Dec, DECIMAL *, I4, LONG)
FORWARD_COERCION_(Dec, DECIMAL *, R4, FLOAT)
FORWARD_COERCION_(Dec, DECIMAL *, R8, DOUBLE)
FORWARD_COERCION_(Dec, DECIMAL *, Cy, CY)
FORWARD_COERCION_(Dec, DECIMAL *, Date, DATE)
FORWARD_COERCION_(Dec, DECIMAL *, Bool, VARIANT_BOOL)
FORWARD_COERCION_(Dec, DECIMAL *, Dec, DECIMAL *)
FORWARD_4_(HRESULT, VarDecFromStr, OLECHAR *, LCID, ULONG, DECIMAL * *)
FORWARD_3_(HRESULT, VarDecFromDisp, IDispatch *, LCID, DECIMAL * *)
FORWARD_3_(HRESULT, VarAdd, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarAnd, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarCat, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarDiv, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarEqv, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarIdiv, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarImp, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarMod, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarMul, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarOr, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarPow, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarSub, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarXor, LPVARIANT, LPVARIANT, LPVARIANT)
FORWARD_2_(HRESULT, VarAbs, LPVARIANT, LPVARIANT)
FORWARD_2_(HRESULT, VarFix, LPVARIANT, LPVARIANT)
FORWARD_2_(HRESULT, VarInt, LPVARIANT, LPVARIANT)
FORWARD_2_(HRESULT, VarNeg, LPVARIANT, LPVARIANT)
FORWARD_2_(HRESULT, VarNot, LPVARIANT, LPVARIANT)
FORWARD_3_(HRESULT, VarRound, LPVARIANT, int, LPVARIANT)
FORWARD_4_(HRESULT, VarCmp, LPVARIANT, LPVARIANT, LCID, ULONG )
FORWARD_3_(HRESULT, VarDecAdd, LPDECIMAL, LPDECIMAL, LPDECIMAL)
FORWARD_3_(HRESULT, VarDecDiv, LPDECIMAL, LPDECIMAL, LPDECIMAL)
FORWARD_3_(HRESULT, VarDecMul, LPDECIMAL, LPDECIMAL, LPDECIMAL)
FORWARD_3_(HRESULT, VarDecSub, LPDECIMAL, LPDECIMAL, LPDECIMAL)
FORWARD_2_(HRESULT, VarDecAbs, LPDECIMAL, LPDECIMAL)
FORWARD_2_(HRESULT, VarDecFix, LPDECIMAL, LPDECIMAL)
FORWARD_2_(HRESULT, VarDecInt, LPDECIMAL, LPDECIMAL)
FORWARD_2_(HRESULT, VarDecNeg, LPDECIMAL, LPDECIMAL)
FORWARD_3_(HRESULT, VarDecRound, LPDECIMAL, int, LPDECIMAL)
FORWARD_2_(HRESULT, VarDecCmp, LPDECIMAL, LPDECIMAL)
FORWARD_2_(HRESULT, VarDecCmpR8, LPDECIMAL, double)
FORWARD_3_(HRESULT, VarCyAdd, CY, CY, LPCY)
FORWARD_3_(HRESULT, VarCyMul, CY, CY, LPCY)
FORWARD_3_(HRESULT, VarCyMulI4, CY, long, LPCY)
FORWARD_3_(HRESULT, VarCySub, CY, CY, LPCY)
FORWARD_2_(HRESULT, VarCyAbs, CY, LPCY)
FORWARD_2_(HRESULT, VarCyFix, CY, LPCY)
FORWARD_2_(HRESULT, VarCyInt, CY, LPCY)
FORWARD_2_(HRESULT, VarCyNeg, CY, LPCY)
FORWARD_3_(HRESULT, VarCyRound, CY, int, LPCY)
FORWARD_2_(HRESULT, VarCyCmp, CY, CY)
FORWARD_2_(HRESULT, VarCyCmpR8, CY, double)
FORWARD_3_(HRESULT, VarBstrCat, BSTR, BSTR, LPBSTR)
FORWARD_4_(HRESULT, VarBstrCmp, BSTR, BSTR, LCID, ULONG)
FORWARD_3_(HRESULT, VarR8Pow, double, double, double *)
FORWARD_2_(HRESULT, VarR4CmpR8, float, double)
FORWARD_3_(HRESULT, VarR8Round, double, int, double *)
FORWARD_5_(HRESULT, VarParseNumFromStr, OLECHAR * , LCID , ULONG , NUMPARSE * , BYTE * )
FORWARD_4_(HRESULT, VarNumFromParseNum, NUMPARSE * , BYTE * , ULONG , VARIANT * )