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())
This commit is contained in:
Przemyslaw Czerpak
2010-09-13 13:46:24 +00:00
parent 380597c130
commit 0e90340325
3 changed files with 37 additions and 12 deletions

View File

@@ -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

View File

@@ -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 )

View File

@@ -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 );
}