diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 68d94625e6..fbd57b898a 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,22 @@ The license applies to all entries newer than 2009-04-28. */ +2010-09-13 15:46 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/contrib/hbwin/olecore.c + ! use hb_oleVariantToItemEx() instead of hb_oleVariantToItem() + in hb_oleSafeArrayToItem() to keep original object class when + arrays are created. + * keep original OLE object class when new OLE object is created + in parameters passed by reference or returned by executed + OLE method + * keep original OLE object class when new OLE object is created + by overloaded [] operator + + added 3-rd parameter to __OleEnumNext() function which allow + to set OLE object class. + + * harbour/contrib/hbwin/oleauto.prg + * keep original OLE object class in enumerators (__OleEnumNext()) + 2010-09-13 16:05 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) * harbour/contrib/hbwin/hbwinole.h * harbour/contrib/hbwin/olecore.c diff --git a/harbour/contrib/hbwin/oleauto.prg b/harbour/contrib/hbwin/oleauto.prg index b5d9d888a5..b19affb642 100644 --- a/harbour/contrib/hbwin/oleauto.prg +++ b/harbour/contrib/hbwin/oleauto.prg @@ -93,7 +93,7 @@ METHOD __enumSkip( enum, lDescend ) CLASS WIN_OLEAUTO HB_SYMBOL_UNUSED( lDescend ) - xValue := __OleEnumNext( ::__hObjEnum, @lContinue ) + xValue := __OleEnumNext( ::__hObjEnum, @lContinue, ::classH ) /* set enumerator value */ (@enum):__enumValue( xValue ) diff --git a/harbour/contrib/hbwin/olecore.c b/harbour/contrib/hbwin/olecore.c index 3d0f4a777f..0f1f1423f2 100644 --- a/harbour/contrib/hbwin/olecore.c +++ b/harbour/contrib/hbwin/olecore.c @@ -547,7 +547,8 @@ void hb_oleItemToVariantEx( VARIANT* pVariant, PHB_ITEM pItem, static void hb_oleSafeArrayToItem( PHB_ITEM pItem, SAFEARRAY * pSafeArray, - int iDim, long * plIndex, VARTYPE vt ) + int iDim, long * plIndex, VARTYPE vt, + HB_USHORT uiClass ) { long lFrom, lTo; @@ -578,7 +579,7 @@ static void hb_oleSafeArrayToItem( PHB_ITEM pItem, SAFEARRAY * pSafeArray, { if( vt != VT_VARIANT ) V_VT( &vItem ) = vt; /* it's reserved in VT_DECIMAL structure */ - hb_oleVariantToItem( hb_arrayGetItemPtr( pItem, ++ul ), &vItem ); + hb_oleVariantToItemEx( hb_arrayGetItemPtr( pItem, ++ul ), &vItem, uiClass ); VariantClear( &vItem ); } } @@ -590,7 +591,7 @@ static void hb_oleSafeArrayToItem( PHB_ITEM pItem, SAFEARRAY * pSafeArray, { plIndex[ iDim ] = lFrom; hb_oleSafeArrayToItem( hb_arrayGetItemPtr( pItem, ++ul ), - pSafeArray, iDim, plIndex, vt ); + pSafeArray, iDim, plIndex, vt, uiClass ); } while( ++lFrom <= lTo ); } @@ -891,7 +892,8 @@ void hb_oleVariantToItemEx( PHB_ITEM pItem, VARIANT* pVariant, HB_USHORT uiClass long * plIndex = ( long * ) hb_xgrab( iDim * sizeof( long ) ); hb_oleSafeArrayToItem( pItem, pSafeArray, iDim, plIndex, - ( V_VT( pVariant ) & ~( VT_ARRAY | VT_BYREF ) ) ); + ( V_VT( pVariant ) & ~( VT_ARRAY | VT_BYREF ) ), + uiClass ); hb_xfree( plIndex ); } else @@ -1215,7 +1217,7 @@ static void GetParams( DISPPARAMS * dispparam, HB_BOOL fUseRef ) dispparam->cNamedArgs = 0; } -static void PutParams( DISPPARAMS * dispparam ) +static void PutParams( DISPPARAMS * dispparam, HB_USHORT uiClass ) { VARIANTARG* pRefs = &dispparam->rgvarg[ dispparam->cArgs ]; PHB_ITEM pItem = NULL; @@ -1227,7 +1229,7 @@ static void PutParams( DISPPARAMS * dispparam ) { if( !pItem ) pItem = hb_itemNew( NULL ); - hb_oleVariantToItem( pItem, &dispparam->rgvarg[ uiArg ] ); + hb_oleVariantToItemEx( pItem, &dispparam->rgvarg[ uiArg ], uiClass ); hb_itemParamStoreForward( ( HB_USHORT ) ( dispparam->cArgs - uiArg ), pItem ); VariantClear( pRefs ); pRefs++; @@ -1429,7 +1431,8 @@ HB_FUNC( __OLEENUMNEXT ) VariantInit( &variant ); if( HB_VTBL( pEnum )->Next( HB_THIS_( pEnum ) 1, &variant, NULL ) == S_OK ) { - hb_oleVariantToItem( hb_stackReturnItem(), &variant ); + hb_oleVariantToItemEx( hb_stackReturnItem(), &variant, + ( HB_USHORT ) hb_parni( 3 ) ); VariantClear( &variant ); hb_storl( HB_TRUE, 2 ); } @@ -1499,6 +1502,9 @@ HB_FUNC( WIN_OLEAUTO___ONERROR ) EXCEPINFO excep; UINT uiArgErr; HRESULT lOleError; + HB_USHORT uiClass; + + uiClass = hb_objGetClass( hb_stackSelfItem() ); /* Get object handle */ hb_vmPushDynSym( s_pDyns_hObjAccess ); @@ -1562,10 +1568,10 @@ HB_FUNC( WIN_OLEAUTO___ONERROR ) DISPATCH_PROPERTYGET | DISPATCH_METHOD, &dispparam, &variant, &excep, &uiArgErr ); - PutParams( &dispparam ); + PutParams( &dispparam, uiClass ); FreeParams( &dispparam ); - hb_oleVariantToItem( hb_stackReturnItem(), &variant ); + hb_oleVariantToItemEx( hb_stackReturnItem(), &variant, uiClass ); VariantClear( &variant ); hb_oleSetError( lOleError ); @@ -1593,6 +1599,9 @@ HB_FUNC( WIN_OLEAUTO___OPINDEX ) UINT uiArgErr; HRESULT lOleError, lOleErrorEnum; HB_BOOL fAssign; + HB_USHORT uiClass; + + uiClass = hb_objGetClass( hb_stackSelfItem() ); /* Get object handle */ hb_vmPushDynSym( s_pDyns_hObjAccess ); @@ -1636,10 +1645,10 @@ HB_FUNC( WIN_OLEAUTO___OPINDEX ) DISPATCH_PROPERTYGET | DISPATCH_METHOD, &dispparam, &variant, &excep, &uiArgErr ); - PutParams( &dispparam ); + PutParams( &dispparam, uiClass ); FreeParams( &dispparam ); - hb_oleVariantToItem( hb_stackReturnItem(), &variant ); + hb_oleVariantToItemEx( hb_stackReturnItem(), &variant, uiClass ); VariantClear( &variant ); }