FIXEDPTMARSHALER.C

// Copyright (c) 1997  Microsoft Corporation.  All rights reserved. 
//=====================================================================
// Sample Java/COM Marshaling Hook Class.
//
// Java Type: double
// Com Type: struct {
// WORD fract;
// short value;
// } FIXED;
//=====================================================================



#pragma hdrstop

#include <windows.h>
#include "native.h" // Raw Native Interface declarations.


typedef FIXED *PFIXED, **PPFIXED;



#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif


// Macro for declaring RNI Java methods's (and encapsulating the java class package.)
#define JAVAMETHOD(typ, name) \
__declspec(dllexport) \
EXTERNC \
typ __cdecl FixedPtMarshaler_##name


#define LOGCALL(hookname) OutputDebugString("FixedPtMarshaler." hookname "() called.\n")

// Export that tells what RNI version we were built under.
DWORD __cdecl RNIGetCompatibleVersion()
{
return RNIVER;
}


//==========================================================================
// toJava
//==========================================================================
JAVAMETHOD(double, toJava) (OBJECT*x, PPFIXED ppFIXED, int flags)
{
const FIXED *pFIXED = *ppFIXED;

LOGCALL("toJava");

// Convert FIXED to double.
return ((double)(pFIXED->value)) + ((double)(pFIXED->fract)) / 65536.0;
}


//==========================================================================
// copyToExternal
//==========================================================================
JAVAMETHOD(void, copyToExternal) (OBJECT*x, double javaval, PPFIXED ppFIXED, int flags)
{
FIXED *pFIXED = *ppFIXED;

LOGCALL("copyToExternal");

// Convert double to FIXED.
if (javaval > 32767.0 || javaval < -32768.0) {
SignalErrorPrintf("java/lang/IllegalArgumentException", "Overflow on double->FIXED conversion.");
} else {
pFIXED->value = (short)javaval;
pFIXED->fract = (short) ((javaval - (short)javaval) * 65536.0);
}
}




//==========================================================================
// TODO: Remove this copy of DllMain if you are embedding this file in your
// own DLL.
// DLL Loader entry point.
//==========================================================================
BOOL WINAPI DllMain(HINSTANCE hmod, DWORD dwReason,
PVOID pvReserved)
{
return TRUE;
}