2009-08-14 15:52 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/contrib/hbwin/olecore.c
    + added support for decoding VT_DECIMAL variants
    + added disabled by default support for passing pointer items just like
      in old OLE code
    + added decoding of VT_VARIANT passed by reference
    + encode NIL or other not directly supported types passed by reference
      as VT_VARIANT passed by reference
    * added disabled by '#if 0' code which uses VT_VARIANT | VT_BYREF
      to pass parameters by reference for testing
This commit is contained in:
Przemyslaw Czerpak
2009-08-14 13:53:00 +00:00
parent bb5e7a4c1c
commit 62e358dbf8
2 changed files with 78 additions and 15 deletions

View File

@@ -17,6 +17,17 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-08-14 15:52 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/hbwin/olecore.c
+ added support for decoding VT_DECIMAL variants
+ added disabled by default support for passing pointer items just like
in old OLE code
+ added decoding of VT_VARIANT passed by reference
+ encode NIL or other not directly supported types passed by reference
as VT_VARIANT passed by reference
* added disabled by '#if 0' code which uses VT_VARIANT | VT_BYREF
to pass parameters by reference for testing
2009-08-14 15:12 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/rtl/hbproces.c
* respect _SET_OSCODEPAGE in hb_fsProcessOpen() and hb_fsProcessRun()

View File

@@ -280,7 +280,19 @@ static void hb_oleItemToVariantRef( VARIANT* pVariant, PHB_ITEM pItem,
}
break;
case HB_IT_OBJECT: /* or ARRAY */
#ifdef HB_OLE_PASS_POINTERS
case HB_IT_POINTER:
pVariant->n1.n2.vt = VT_PTR;
pVariant->n1.n2.n3.byref = hb_itemGetPtr( pItem );
if( pVarRef )
{
pVarRef->n1.n2.vt = VT_PTR | VT_BYREF;
pVarRef->n1.n2.n3.byref = &pVariant->n1.n2.n3.byref;
}
break;
#endif
case HB_IT_ARRAY: /* or OBJECT */
if( HB_IS_OBJECT( pItem ) )
{
if( hb_clsIsParent( hb_objGetClass( pItem ), "WIN_OLEAUTO" ) )
@@ -336,7 +348,26 @@ static void hb_oleItemToVariantRef( VARIANT* pVariant, PHB_ITEM pItem,
}
}
break;
default:
if( pVarRef )
{
pVarRef->n1.n2.vt = VT_VARIANT | VT_BYREF;
pVarRef->n1.n2.n3.pvarVal = pVariant;
}
}
/* enabling this code may allow to exchange parameters by reference
* without strong typing restrictions but I do not know if such method
* is honored by other OLE code
*/
#if 0
if( pVarRef )
{
pVarRef->n1.n2.vt = VT_VARIANT | VT_BYREF;
pVarRef->n1.n2.n3.pvarVal = pVariant;
}
#endif
}
void hb_oleItemToVariant( VARIANT* pVariant, PHB_ITEM pItem )
@@ -357,6 +388,9 @@ PHB_ITEM hb_oleItemPut( PHB_ITEM pItem, IDispatch* pDisp )
void hb_oleVariantToItem( PHB_ITEM pItem, VARIANT* pVariant )
{
if( pVariant->n1.n2.vt == VT_VARIANT | VT_BYREF )
pVariant = pVariant->n1.n2.n3.pvarVal;
switch( pVariant->n1.n2.vt )
{
case VT_DISPATCH:
@@ -513,6 +547,22 @@ void hb_oleVariantToItem( PHB_ITEM pItem, VARIANT* pVariant )
#endif
break;
case VT_INT:
hb_itemPutNI( pItem, pVariant->n1.n2.n3.intVal );
break;
case VT_INT | VT_BYREF:
hb_itemPutNI( pItem, *pVariant->n1.n2.n3.pintVal );
break;
case VT_UINT:
hb_itemPutNInt( pItem, ( HB_LONG ) pVariant->n1.n2.n3.uintVal );
break;
case VT_UINT | VT_BYREF:
hb_itemPutNInt( pItem, ( HB_LONG ) *pVariant->n1.n2.n3.puintVal );
break;
case VT_R4:
hb_itemPutND( pItem, ( double ) pVariant->n1.n2.n3.fltVal );
break;
@@ -537,24 +587,20 @@ void hb_oleVariantToItem( PHB_ITEM pItem, VARIANT* pVariant )
pVariant->n1.n2.n3.cyVal :
*pVariant->n1.n2.n3.pcyVal, &dblVal );
hb_itemPutND( pItem, dblVal );
/* hb_itemPutNDLen( pItem, dblVal, 0, 4 ); */
break;
}
case VT_INT:
hb_itemPutNI( pItem, pVariant->n1.n2.n3.intVal );
break;
case VT_INT | VT_BYREF:
hb_itemPutNI( pItem, *pVariant->n1.n2.n3.pintVal );
break;
case VT_UINT:
hb_itemPutNInt( pItem, ( HB_LONG ) pVariant->n1.n2.n3.uintVal );
break;
case VT_UINT | VT_BYREF:
hb_itemPutNInt( pItem, ( HB_LONG ) *pVariant->n1.n2.n3.puintVal );
case VT_DECIMAL:
case VT_DECIMAL | VT_BYREF:
{
double dblVal;
VarR8FromDec( pVariant->n1.n2.vt == VT_DECIMAL ?
&pVariant->n1.decVal :
pVariant->n1.n2.n3.pdecVal, &dblVal );
hb_itemPutND( pItem, dblVal );
break;
}
case VT_DATE:
case VT_DATE | VT_BYREF:
@@ -572,6 +618,12 @@ void hb_oleVariantToItem( PHB_ITEM pItem, VARIANT* pVariant )
break;
}
#ifdef HB_OLE_PASS_POINTERS
case VT_PTR:
hb_itemPutPtr( pItem, pVariant->n1.n2.n3.byref );
break;
#endif
default:
hb_itemClear( pItem );
}