diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 24332b6290..2e218022d6 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,18 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-05-26 22:54 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/contrib/hbwin/hbwinole.h + * harbour/contrib/hbwin/olecore.c + * modified hb_oleVariantUpdate() parameters + + added automatic conversion of HVM objects to OLE objects for + for parameters passed by reference to Harbour OLE server methods. + + * harbour/contrib/hbwin/hbolesrv.c + + added automatic conversion of HVM objects to OLE objects for + memvars redirected to OLE instance variables. + ! fixed typo + 2010-05-26 17:04 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * utils/hbmk2/hbmk2.prg * utils/hbmk2/hbmk2.pt_BR.po diff --git a/harbour/contrib/hbwin/hbolesrv.c b/harbour/contrib/hbwin/hbolesrv.c index 446956d5db..162fa1f6ed 100644 --- a/harbour/contrib/hbwin/hbolesrv.c +++ b/harbour/contrib/hbwin/hbolesrv.c @@ -433,7 +433,7 @@ static HRESULT STDMETHODCALLTYPE Invoke( IDispatch* lpThis, DISPID dispid, REFII pParams->cArgs == 0 ) { if( pVarResult ) - hb_oleItemToVariant( pVarResult, pItem ); + hb_oleItemToVariantEx( pVarResult, pItem, s_objItemToVariant ); fResult = HB_TRUE; } else if( ( wFlags & DISPATCH_PROPERTYPUT ) != 0 && @@ -497,7 +497,7 @@ static HRESULT STDMETHODCALLTYPE Invoke( IDispatch* lpThis, DISPID dispid, REFII { PHB_ITEM pItem = hb_stackAllocItem(); hb_memvarGet( pItem, hb_dynsymSymbol( pDynSym ) ); - hb_oleItemToVariant( pVarResult, pItem ); + hb_oleItemToVariantEx( pVarResult, pItem, s_objItemToVariant ); hb_stackPop(); } return S_OK; @@ -611,6 +611,7 @@ static HB_BOOL s_objItemToVariant( VARIANT * pVariant, PHB_ITEM pItem ) { pVariant->n1.n2.vt = VT_DISPATCH; pVariant->n1.n2.n3.pdispVal = ( IDispatch * ) pvObj; + return HB_TRUE; } return HB_FALSE; } diff --git a/harbour/contrib/hbwin/hbwinole.h b/harbour/contrib/hbwin/hbwinole.h index e42265fc0c..3aed52e647 100644 --- a/harbour/contrib/hbwin/hbwinole.h +++ b/harbour/contrib/hbwin/hbwinole.h @@ -113,7 +113,7 @@ extern HB_EXPORT void hb_oleSetError( HRESULT lOleError ); extern HB_EXPORT void hb_oleVariantToItem( PHB_ITEM pItem, VARIANT * pVariant ); extern HB_EXPORT void hb_oleItemToVariant( VARIANT * pVariant, PHB_ITEM pItem ); extern HB_EXPORT void hb_oleItemToVariantEx( VARIANT* pVariant, PHB_ITEM pItem, HB_OLEOBJ_FUNC pObjFunc ); -extern HB_EXPORT void hb_oleVariantUpdate( VARIANT * pVariant, PHB_ITEM pItem ); +extern HB_EXPORT void hb_oleVariantUpdate( VARIANT * pVariant, PHB_ITEM pItem, HB_OLEOBJ_FUNC pObjFunc ); extern HB_EXPORT IDispatch* hb_oleParam( int iParam ); extern HB_EXPORT IDispatch* hb_oleItemGet( PHB_ITEM pItem ); extern HB_EXPORT PHB_ITEM hb_oleItemPut( PHB_ITEM pItem, IDispatch * pDisp ); diff --git a/harbour/contrib/hbwin/olecore.c b/harbour/contrib/hbwin/olecore.c index 2487365aaf..5cd19860e8 100644 --- a/harbour/contrib/hbwin/olecore.c +++ b/harbour/contrib/hbwin/olecore.c @@ -502,7 +502,7 @@ static void hb_oleItemToVariantRef( VARIANT* pVariant, PHB_ITEM pItem, long lIndex[ 1 ]; VariantInit( &vItem ); - hb_oleItemToVariantRef( &vItem, hb_arrayGetItemPtr( pItem, ul + 1 ), NULL, NULL ); + hb_oleItemToVariantRef( &vItem, hb_arrayGetItemPtr( pItem, ul + 1 ), NULL, pObjFunc ); lIndex[ 0 ] = ( long ) ul; SafeArrayPutElement( pSafeArray, lIndex, &vItem ); VariantClear( &vItem ); @@ -538,8 +538,8 @@ void hb_oleItemToVariant( VARIANT* pVariant, PHB_ITEM pItem ) } -void hb_oleItemToVariantExt( VARIANT* pVariant, PHB_ITEM pItem, - HB_OLEOBJ_FUNC pObjFunc ) +void hb_oleItemToVariantEx( VARIANT* pVariant, PHB_ITEM pItem, + HB_OLEOBJ_FUNC pObjFunc ) { hb_oleItemToVariantRef( pVariant, pItem, NULL, pObjFunc ); } @@ -900,7 +900,8 @@ void hb_oleVariantToItem( PHB_ITEM pItem, VARIANT* pVariant ) } -void hb_oleVariantUpdate( VARIANT* pVariant, PHB_ITEM pItem ) +void hb_oleVariantUpdate( VARIANT* pVariant, PHB_ITEM pItem, + HB_OLEOBJ_FUNC pObjFunc ) { switch( pVariant->n1.n2.vt ) { @@ -919,6 +920,18 @@ void hb_oleVariantUpdate( VARIANT* pVariant, PHB_ITEM pItem ) HB_VTBL( pdispVal )->Release( HB_THIS( pdispVal ) ); } } + else if( pObjFunc && HB_IS_OBJECT( pItem ) ) + { + VARIANTARG variant; + VariantInit( &variant ); + if( pObjFunc( &variant, pItem ) ) + { + IDispatch* pdispVal = *pVariant->n1.n2.n3.ppdispVal; + *pVariant->n1.n2.n3.ppdispVal = variant.n1.n2.n3.pdispVal; + if( pdispVal ) + HB_VTBL( pdispVal )->Release( HB_THIS( pdispVal ) ); + } + } break; } @@ -944,6 +957,18 @@ void hb_oleVariantUpdate( VARIANT* pVariant, PHB_ITEM pItem ) } } } + else if( pObjFunc && HB_IS_OBJECT( pItem ) ) + { + VARIANTARG variant; + VariantInit( &variant ); + if( pObjFunc( &variant, pItem ) ) + { + IDispatch* pdispVal = *pVariant->n1.n2.n3.ppdispVal; + *pVariant->n1.n2.n3.ppdispVal = variant.n1.n2.n3.pdispVal; + if( pdispVal ) + HB_VTBL( pdispVal )->Release( HB_THIS( pdispVal ) ); + } + } break; } @@ -1041,7 +1066,7 @@ void hb_oleVariantUpdate( VARIANT* pVariant, PHB_ITEM pItem ) #endif case VT_BYREF | VT_VARIANT: - hb_oleItemToVariantRef( pVariant->n1.n2.n3.pvarVal, pItem, NULL, NULL ); + hb_oleItemToVariantRef( pVariant->n1.n2.n3.pvarVal, pItem, NULL, pObjFunc ); break; case VT_VARIANT | VT_ARRAY | VT_BYREF: @@ -1121,7 +1146,7 @@ HB_BOOL hb_oleDispInvoke( PHB_SYMB pSym, PHB_ITEM pObject, PHB_ITEM pParam, hb_oleItemToVariantRef( pVarResult, hb_stackReturnItem(), NULL, pObjFunc ); for( i = 0; i < iRefs; i++ ) - hb_oleVariantUpdate( refArray[ i ].variant, refArray[ i ].item ); + hb_oleVariantUpdate( refArray[ i ].variant, refArray[ i ].item, pObjFunc ); for( i = 0; i < iRefs; i++ ) hb_stackPop();