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:
@@ -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()
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user