home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 39 / IOPROG_39.ISO / SOFT / sdkjava40.exe / data1.cab / fg_Samples / Samples / COM / CustomMarshal / varstr / VarStrMarshaler.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-04  |  3.8 KB  |  163 lines

  1. //=====================================================================
  2. // Sample Java/COM Marshaling Hook Class.
  3. //
  4. // Java Type:  String
  5. // Com  Type:  VARIANT (BSTR type).
  6. // 
  7. // (C) Copyright 1995 - 1999 Microsoft Corporation.  All rights reserved.
  8. //=====================================================================
  9.  
  10.  
  11.  
  12.  
  13. #pragma hdrstop
  14.  
  15. #include <windows.h>
  16. #include "native.h" // Raw Native Interface declarations.
  17.  
  18.  
  19.  
  20. typedef VARIANT *PVARIANT, **PPVARIANT;
  21.  
  22.  
  23.  
  24. #ifdef __cplusplus
  25. #define EXTERNC     extern "C"
  26. #else
  27. #define EXTERNC
  28. #endif
  29.  
  30.  
  31. // Macro for declaring RNI Java methods's (and encapsulating the java class package.)
  32. #define JAVAMETHOD(typ, name) \
  33.     __declspec(dllexport) \
  34.     EXTERNC \
  35.     typ __cdecl VarStrMarshaler_##name
  36.  
  37. // Export that tells what RNI version we were built under.
  38. DWORD __cdecl RNIGetCompatibleVersion()
  39. {
  40.   return RNIVER;
  41. }
  42.  
  43.  
  44. #define LOGCALL(hookname) OutputDebugString("VarStrMarshaler." hookname "() called.\n")
  45.  
  46.  
  47. //==========================================================================
  48. // toJava
  49. //==========================================================================
  50. JAVAMETHOD(HString*, toJava) (OBJECT*x, PPVARIANT ppVARIANT, int flags)
  51. {
  52.     VARIANT *pvar = *ppVARIANT;
  53.  
  54.     LOGCALL("toJava");
  55.  
  56.     
  57.     if (pvar->vt != VT_BSTR) {
  58.         // Could try to coerce the variant, but this is just an example.
  59.         SignalErrorPrintf("java/lang/IllegalArgumentException",
  60.                           "Variant is of wrong type (must be VT_BSTR.)");
  61.     } else {
  62.         return makeJavaStringW(pvar->bstrVal, SysStringLen(pvar->bstrVal));
  63.     }
  64. }
  65.  
  66.  
  67. //==========================================================================
  68. // copyToExternal
  69. //==========================================================================
  70. JAVAMETHOD(void, copyToExternal) (OBJECT*x, HString* javaval, PPVARIANT ppVARIANT, int flags)
  71. {
  72.     PVARIANT pVARIANT = *ppVARIANT;
  73.     BSTR bstr;
  74.  
  75.     LOGCALL("copyToExternal");
  76.  
  77.     if (!javaval) {
  78.         SignalErrorPrintf("java/lang/NullPointerException", "Null string not allowed.");
  79.     } else {
  80.         bstr = SysAllocStringLen(javaStringStart(javaval),
  81.                                  (UINT)(javaStringLength(javaval)));
  82.     
  83.     
  84.         if (!bstr) {
  85.             SignalErrorPrintf("java/lang/OutOfMemoryError", "Not enough room in BSTR system heap.");
  86.         } else {
  87.     
  88.             char msg[100];
  89.             wsprintf(msg, "Hook class allocated BSTR at %lxh\n", bstr);
  90.             OutputDebugString(msg);
  91.     
  92.             // We explicitly do NOT call VariantClear before overwriting the variant.
  93.             // That is the job of releaseByValExternal, which will be called when needed.
  94.             pVARIANT->vt      = VT_BSTR;
  95.             pVARIANT->bstrVal = bstr;
  96.         }
  97.     }
  98.  
  99. }
  100.  
  101.  
  102. //==========================================================================
  103. // releaseByValExternal
  104. //==========================================================================
  105. JAVAMETHOD(void, releaseByValExternal) (OBJECT*x, PPVARIANT ppVARIANT, int flags)
  106. {
  107.     PVARIANT pVARIANT = *ppVARIANT;
  108.  
  109.     LOGCALL("releaseByValExternal");
  110.     if (pVARIANT->vt == VT_BSTR) {
  111.         char msg[100];
  112.         wsprintf(msg, "Hook class freeing BSTR at %lxh\n", pVARIANT->bstrVal);
  113.         OutputDebugString(msg);
  114.  
  115.         SysFreeString(pVARIANT->bstrVal);
  116.     }
  117. }
  118.  
  119.  
  120.  
  121. //==========================================================================
  122. // TODO: Remove this copy of DllMain if you are embedding this file in your
  123. //  own DLL.
  124. // DLL Loader entry point.
  125. //==========================================================================
  126. BOOL WINAPI DllMain(HINSTANCE hmod, DWORD dwReason,
  127.                                 PVOID pvReserved)
  128. {
  129.    return TRUE;
  130. }
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.