diff --git a/ChangeLog.txt b/ChangeLog.txt index 3b2797f26e..3eb7c38d5b 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,14 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2017-05-12 17:21 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * contrib/hbwin/oleauto.prg + * contrib/hbwin/olecore.c + * contrib/hbwin/hbwin.hbx + * code cleanups and some synchronizations with Viktor's branch + + added new PRG function borrowed from Viktor's branch: + win_oleClassExists( | ) -> + 2017-05-12 14:12 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/hbwin/olecore.c + added support for typed variant references created by __oleVariantNew() diff --git a/contrib/hbwin/hbwin.hbx b/contrib/hbwin/hbwin.hbx index 4b40e41295..a49a717bd7 100644 --- a/contrib/hbwin/hbwin.hbx +++ b/contrib/hbwin/hbwin.hbx @@ -341,6 +341,7 @@ DYNAMIC win_OEMToANSI DYNAMIC win_oleAuto DYNAMIC win_oleAuto___OnError DYNAMIC win_oleAuto___OpIndex +DYNAMIC win_oleClassExists DYNAMIC win_oleCreateObject DYNAMIC win_oleError DYNAMIC win_oleErrorText diff --git a/contrib/hbwin/oleauto.prg b/contrib/hbwin/oleauto.prg index dcfd3ab04b..3d840e57bf 100644 --- a/contrib/hbwin/oleauto.prg +++ b/contrib/hbwin/oleauto.prg @@ -70,8 +70,7 @@ METHOD __enumStart( enum, lDescend ) CLASS win_oleAuto LOCAL hObjEnum - hObjEnum := __oleEnumCreate( ::__hObj, lDescend ) - IF ! Empty( hObjEnum ) + IF ! Empty( hObjEnum := __oleEnumCreate( ::__hObj, lDescend ) ) IF ! Empty( ::__hObjEnum ) /* small hack - clone the object array for nested FOR EACH calls */ self := __objClone( self ) @@ -111,8 +110,7 @@ FUNCTION win_oleGetActiveObject( ... ) LOCAL oOle, hOle - hOle := __oleGetActiveObject( ... ) - IF ! Empty( hOle ) + IF ! Empty( hOle := __oleGetActiveObject( ... ) ) oOle := win_oleAuto() oOle:__hObj := hOle ENDIF @@ -124,8 +122,7 @@ FUNCTION win_oleCreateObject( ... ) LOCAL oOle, hOle - hOle := __oleCreateObject( ... ) - IF ! Empty( hOle ) + IF ! Empty( hOle := __oleCreateObject( ... ) ) oOle := win_oleAuto() oOle:__hObj := hOle ENDIF diff --git a/contrib/hbwin/olecore.c b/contrib/hbwin/olecore.c index 421c4638f7..5e5ab6ab0f 100644 --- a/contrib/hbwin/olecore.c +++ b/contrib/hbwin/olecore.c @@ -55,7 +55,7 @@ #if ( defined( __POCC__ ) && defined( HB_OS_WIN_CE ) ) || \ defined( __DMC__ ) || \ ( defined( _MSC_VER ) && ( _MSC_VER <= 1500 ) ) -# define HB_OLE_NO_LL + #define HB_OLE_NO_LL #endif #if ( defined( __POCC__ ) && defined( HB_OS_WIN_CE ) ) || \ @@ -63,7 +63,7 @@ defined( __MINGW32__ ) || \ defined( __DMC__ ) || \ ( defined( _MSC_VER ) && ( _MSC_VER <= 1500 ) ) -# define HB_OLE_NO_LLREF + #define HB_OLE_NO_LLREF #endif @@ -364,10 +364,10 @@ void hb_oleItemSetCallBack( PHB_ITEM pItem, PHB_ITEM * pCallBack ) { if( pOle->pCallBack && *pOle->pCallBack ) { - PHB_ITEM pCallBack = *pOle->pCallBack; + PHB_ITEM pCallBackPrev = *pOle->pCallBack; *pOle->pCallBack = NULL; pOle->pCallBack = NULL; - hb_itemRelease( pCallBack ); + hb_itemRelease( pCallBackPrev ); } if( pCallBack ) { @@ -1049,10 +1049,9 @@ static void hb_oleSafeArrayToItem( PHB_ITEM pItem, SAFEARRAY * pSafeArray, { long lFrom, lTo; - SafeArrayGetLBound( pSafeArray, iDim, &lFrom ); - SafeArrayGetUBound( pSafeArray, iDim, &lTo ); - - if( lFrom <= lTo ) + if( SafeArrayGetLBound( pSafeArray, iDim, &lFrom ) == S_OK && + SafeArrayGetUBound( pSafeArray, iDim, &lTo ) == S_OK && + lFrom <= lTo ) { HB_SIZE ul = 0; @@ -1324,9 +1323,10 @@ void hb_oleVariantToItemEx( PHB_ITEM pItem, VARIANT * pVariant, HB_USHORT uiClas case VT_CY | VT_BYREF: { double dblVal; - VarR8FromCy( V_VT( pVariant ) == VT_CY ? - V_CY( pVariant ) : - *V_CYREF( pVariant ), &dblVal ); + if( VarR8FromCy( V_VT( pVariant ) == VT_CY ? + V_CY( pVariant ) : + *V_CYREF( pVariant ), &dblVal ) != S_OK ) + dblVal = 0; hb_itemPutND( pItem, dblVal ); /* hb_itemPutNDLen( pItem, dblVal, 0, 4 ); */ break; @@ -1336,9 +1336,10 @@ void hb_oleVariantToItemEx( PHB_ITEM pItem, VARIANT * pVariant, HB_USHORT uiClas case VT_DECIMAL | VT_BYREF: { double dblVal; - VarR8FromDec( V_VT( pVariant ) == VT_DECIMAL ? - &HB_WIN_U1( pVariant, decVal ) : - V_DECIMALREF( pVariant ), &dblVal ); + if( VarR8FromDec( V_VT( pVariant ) == VT_DECIMAL ? + &HB_WIN_U1( pVariant, decVal ) : + V_DECIMALREF( pVariant ), &dblVal ) != S_OK ) + dblVal = 0; hb_itemPutND( pItem, dblVal ); break; } @@ -1377,7 +1378,7 @@ void hb_oleVariantToItemEx( PHB_ITEM pItem, VARIANT * pVariant, HB_USHORT uiClas default: if( V_VT( pVariant ) & VT_ARRAY ) { - SAFEARRAY * pSafeArray = V_VT( pVariant ) & VT_BYREF ? + SAFEARRAY * pSafeArray = ( V_VT( pVariant ) & VT_BYREF ) ? *V_ARRAYREF( pVariant ) : V_ARRAY( pVariant ); if( pSafeArray ) @@ -1674,8 +1675,8 @@ HB_BOOL hb_oleDispInvoke( PHB_SYMB pSym, PHB_ITEM pObject, PHB_ITEM pParam, static void GetParams( DISPPARAMS * dispparam, HB_UINT uiOffset, HB_BOOL fUseRef, UINT uiNamedArgs, PHB_ITEM * pNamedArgs, DISPID * pDispIds ) { - VARIANTARG * pArgs = NULL, * pRefs; - UINT uiArgCount, uiArg, uiRefs; + VARIANTARG * pArgs = NULL; + UINT uiArgCount; uiArgCount = ( UINT ) hb_pcount(); if( uiOffset > uiArgCount ) @@ -1685,6 +1686,9 @@ static void GetParams( DISPPARAMS * dispparam, HB_UINT uiOffset, HB_BOOL fUseRef if( uiArgCount > 0 || uiNamedArgs > 0 ) { + VARIANTARG * pRefs; + UINT uiArg, uiRefs; + uiRefs = 0; if( fUseRef ) { @@ -1795,10 +1799,10 @@ static void PutParams( DISPPARAMS * dispparam, HB_UINT uiOffset, HB_USHORT uiCla static void FreeParams( DISPPARAMS * dispparam ) { - UINT ui; - if( dispparam->cArgs > 0 ) { + UINT ui; + for( ui = 0; ui < dispparam->cArgs; ui++ ) VariantClear( &dispparam->rgvarg[ ui ] ); @@ -1814,9 +1818,28 @@ HB_FUNC( __OLEISDISP ) hb_retl( hb_oleItemGet( hb_param( 1, HB_IT_ANY ) ) != NULL ); } +HB_FUNC( WIN_OLECLASSEXISTS ) /* ( cOleName | cCLSID ) */ +{ + HB_BOOL fExists = HB_FALSE; + const char * cOleName = hb_parc( 1 ); + + if( cOleName ) + { + CLSID ClassID; + wchar_t * cCLSID = AnsiToWide( cOleName ); + if( cOleName[ 0 ] == '{' ) + fExists = ( CLSIDFromString( ( LPOLESTR ) cCLSID, &ClassID ) == NOERROR ); + else + fExists = ( CLSIDFromProgID( ( LPCOLESTR ) cCLSID, &ClassID ) == S_OK ); + hb_xfree( cCLSID ); + } + + hb_retl( fExists ); +} + + HB_FUNC( __OLECREATEOBJECT ) /* ( cOleName | cCLSID [, cIID ] ) */ { - wchar_t * cCLSID; GUID ClassID, iid = IID_IDispatch; IDispatch * pDisp = NULL; const char * cOleName = hb_parc( 1 ); @@ -1827,7 +1850,8 @@ HB_FUNC( __OLECREATEOBJECT ) /* ( cOleName | cCLSID [, cIID ] ) */ if( cOleName ) { - cCLSID = AnsiToWide( cOleName ); + wchar_t * cCLSID = AnsiToWide( cOleName ); + if( cOleName[ 0 ] == '{' ) lOleError = CLSIDFromString( ( LPOLESTR ) cCLSID, &ClassID ); else @@ -2016,21 +2040,17 @@ HB_FUNC( __OLEENUMNEXT ) HB_FUNC( WIN_OLEERROR ) { - hb_retnl( hb_oleGetError() ); + hb_retnint( hb_oleGetError() ); } #ifndef DISP_E_BUFFERTOOSMALL - #define DISP_E_BUFFERTOOSMALL 0x80020013L +#define DISP_E_BUFFERTOOSMALL 0x80020013L #endif + HB_FUNC( WIN_OLEERRORTEXT ) { - HRESULT lOleError; - - if( HB_ISNUM( 1 ) ) - lOleError = hb_parnl( 1 ); - else - lOleError = hb_oleGetError(); + HRESULT lOleError = HB_ISNUM( 1 ) ? hb_parnl( 1 ) : hb_oleGetError(); switch( lOleError ) { @@ -2118,6 +2138,8 @@ HB_FUNC( WIN_OLEAUTO___ONERROR ) hb_oleInit(); uiClass = hb_objGetClass( hb_stackSelfItem() ); + if( uiClass == 0 ) + return; /* Get object handle */ hb_vmPushDynSym( s_pDyns_hObjAccess ); @@ -2259,13 +2281,15 @@ HB_FUNC( WIN_OLEAUTO___OPINDEX ) VARIANTARG variant; EXCEPINFO excep; UINT uiArgErr; - HRESULT lOleError, lOleErrorEnum; + HRESULT lOleError; HB_BOOL fAssign; HB_USHORT uiClass; hb_oleInit(); uiClass = hb_objGetClass( hb_stackSelfItem() ); + if( uiClass == 0 ) + return; /* Get object handle */ hb_vmPushDynSym( s_pDyns_hObjAccess ); @@ -2323,6 +2347,7 @@ HB_FUNC( WIN_OLEAUTO___OPINDEX ) /* Try to detect if object is a collection */ char * szDescription = NULL; char * szSource = NULL; + HRESULT lOleErrorEnum; if( lOleError == DISP_E_EXCEPTION ) hb_oleExcepDescription( &excep, &szDescription, &szSource );