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( <cOleName> | <cCLSID> ) -> <lExists>
This commit is contained in:
@@ -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( <cOleName> | <cCLSID> ) -> <lExists>
|
||||
|
||||
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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user