/*++ Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved. Module Name: nativcom.h Abstract: Public header for COM-marshaling facilities provided by msjava.dll. --*/ #ifndef _NATIVCOM_ #define _NATIVCOM_ #include #include #ifdef __cplusplus extern "C" { #endif //---------------------------------------------------------------------------- // COM and J/Direct data wrapper helpers... //---------------------------------------------------------------------------- // Replaces the data pointer contained in the data wrapper with a new blob of // non-GC'ed heap memory. The previous blob, if any, will be freed if its // owned by the VM. JAVAVMAPI void* __cdecl jcdwNewData( HObject * phJCDW, unsigned int numBytes ); // Returns the data pointer to the non GC'ed heap memory contained by the data // wrapper object. JAVAVMAPI void* __cdecl jcdwGetData( HObject *phJCDW ); // Replaces the data pointer that this data wrapper represents with the // specified JAVAVMAPI int __cdecl jcdwSetData( HObject *phJCDW, LPVOID pv ); // Returns TRUE if the VM allocated the non GC'ed heap memory contained by the // data wrapper. JAVAVMAPI int __cdecl jcdw_memory_freed_on_gc( HObject *phJCDW ); // Returns TRUE if the VM frees the non GC'ed heap memory that this data // wrapper contains when the data wrapper is garbage collected. JAVAVMAPI int __cdecl jcdw_java_owned( HObject *phJCDW ); // Returns the size of the non GC'ed heap memory contained by the data wrapper // object. JAVAVMAPI unsigned int __cdecl jcdwSizeOf( HObject *phJCDW ); // Returns the size of the non GC'ed heap memory used by instances of the // supplied java/lang/Class object. JAVAVMAPI unsigned int __cdecl jcdwClassSizeOf( HObject *phJavaClass ); // Returns the byte offset within the non GC'ed heap memory to the specified // field name. JAVAVMAPI unsigned int __cdecl jcdwOffsetOf( HObject *phJCDW, PCUTF8 putfFieldName ); // Returns the byte offset within the non GC'ed heap memory to the specified // field name from the supplied java/lang/Class object. JAVAVMAPI unsigned int __cdecl jcdwClassOffsetOf( HObject *phJCDWClass, PCUTF8 putfFieldName ); // Given an object, propagates field values from the Java object to the object's // associated native memory. // Returns FALSE on error, else TRUE. JAVAVMAPI int __cdecl jcdwPropagateToNative( HObject *phJCDW ); // Given an object, propagates field values from the object's associated native // memory to the Java object. If fFreeIndirectNativeMemory is TRUE, the native // memory used for any reference fields (Strings, custom marshaled fields, ...) // will be released. // Returns FALSE on error, else TRUE. JAVAVMAPI int __cdecl jcdwPropagateToJava( HObject *phJCDW, BOOL fFreeIndirectNativeMemory ); // Returns a Java callable wrapper that can be used to access the specified // interface pointer. The VM will keep a reference to this interface pointer. // If 'fAssumeThreadSafe' is FALSE, the VM will auto-marshal all COM calls to // the current COM context. JAVAVMAPI HObject * __cdecl convert_IUnknown_to_Java_Object( IUnknown *punk, HObject *phJavaClass, int fAssumeThreadSafe ); // Returns a Java callable wrapper that can be used to access the specified // interface pointer. The VM will keep a reference to this interface pointer. // If 'fAssumeThreadSafe' is FALSE, the VM will auto-marshal all COM calls to // the current COM context. JAVAVMAPI HObject * __cdecl convert_IUnknown_to_Java_Object2( IUnknown *punk, ClassClass *pClassClass, int fFreeThreaded ); // Returns an interface pointer usable from the current COM context. JAVAVMAPI IUnknown * __cdecl convert_Java_Object_to_IUnknown( HObject *phJavaObject, const IID *pIID ); // Returns a data wrapper object of the supplied Class type that points at the // supplied data pointer. The memory is not owned by the VM. JAVAVMAPI HObject * __cdecl convert_ptr_to_jcdw( void *pExtData, HObject *phJavaClass ); //---------------------------------------------------------------------------- // Map HRESULT to ComException. //---------------------------------------------------------------------------- JAVAVMAPI void __cdecl SignalErrorHResult( HRESULT theHRESULT ); //---------------------------------------------------------------------------- // Map Java exception to HRESULT. //---------------------------------------------------------------------------- JAVAVMAPI HRESULT __cdecl HResultFromException( HObject *exception_object ); typedef HObject *JAVAARG; //---------------------------------------------------------------------------- // Information structure for Java->COM Custom Method hook. //---------------------------------------------------------------------------- typedef struct { DWORD cbSize; // size of structure in bytes IUnknown *punk; // pointer to interface being invoked const volatile JAVAARG *pJavaArgs; // pointer to Java argument stack } J2CMethodHookInfo; //---------------------------------------------------------------------------- // Information structure for COM->Java Custom Method hook. //---------------------------------------------------------------------------- typedef struct { DWORD cbSize; // size of structure in bytes struct methodblock *javaMethod; // java method to call LPVOID pComArgs; // pointer to COM method argument stack const volatile JAVAARG *ppThis; // pointer to pointer to Java this // Store the COM result here. union { HRESULT resHR; DWORD resDWORD; double resDouble; }; } C2JMethodHookInfo; JAVAVMAPI WORD __cdecl j2chook_getsizeofuserdata( J2CMethodHookInfo *phookinfo ); JAVAVMAPI LPVOID __cdecl j2chook_getuserdata( J2CMethodHookInfo *phookinfo ); // Returns the vtable index of the target method. JAVAVMAPI WORD __cdecl j2chook_getvtblindex( J2CMethodHookInfo *phookinfo ); // Returns the methodblock of the target method. JAVAVMAPI struct methodblock* __cdecl j2chook_getmethodblock( J2CMethodHookInfo *phookinfo ); JAVAVMAPI WORD __cdecl c2jhook_getsizeofuserdata( C2JMethodHookInfo *phookinfo ); JAVAVMAPI LPVOID __cdecl c2jhook_getuserdata( C2JMethodHookInfo *phookinfo ); // Returns the class defining the interface method. This is the class // containing the MCCustomMethod descriptor. JAVAVMAPI ClassClass * __cdecl c2jhook_getexposingclass( C2JMethodHookInfo *phookinfo ); //---------------------------------------------------------------------------- // Thread marshaling helpers // // The MarshalCall<> APIs will reexecute the RNI method on the supplied thread // id or on the apartment thread for the supplied Java object. The APIs will // return the following sets of HRESULTS: // // S_OK The call successfully was marshaled to the target thread. // The marshaled call may have generated an exception, which can // bechecked by calling exceptionOccurred. // S_FALSE The call did not require marshaling to the other thread-- // the currently executing thread is the target thread. // E_<> An error occurred inside the MarshalCall<> API (invalid // arguments, out of memory, etc). // // The typical use of these APIs is to call the appropriate MarshalCall<> API // and if the HRESULT is S_FALSE, then execute the rest of the RNI method, // otherwise return with the value contained in pResult. //---------------------------------------------------------------------------- typedef void * JAVATID; #define JAVATID_MAIN_APARTMENT ((JAVATID) 0x00000001) #define JAVATID_SERVER_APARTMENT ((JAVATID) 0x00000002) JAVAVMAPI HRESULT __cdecl MarshalCallToJavaThreadId( JAVATID tid, int64_t *pResult ); JAVAVMAPI HRESULT __cdecl MarshalCallToJavaObjectHostThread( HObject *phobj, int64_t *pResult ); #ifdef __cplusplus } #endif #endif