QueryInterface

 (Available in 01 TS COM - TS_COM_InterfaceSafe)

Purpose

CALLBACK: Query the COM interface

Syntax

IF TS_Succeeded( oInterfaseSafe:QueryInterface( pGUID, poAIUnknown ) )

Arguments

pstruIID
_WinGUID
poAIUnknown
TS_AbstractIUnknown

Description

See MSDN documentation and/or 'Inside COM', it is adviced not to use this method and use 'AGetInterface()' instead.

Returns

HResult

Source

METHOD QueryInterface( pstruIID AS _WinGUID, poAIUnknown AS TS_AbstractIUnknown PTR  ; ...
...) AS LONG PASCAL CLASS TS_InterfaceSafe
LOCAL oCOMGlobalData AS _TS_COMGlobalData
LOCAL oAIUnknown AS TS_AbstractIUnknown
LOCAL hResult AS LONG
   TSTrace Enter
   oCOMGlobalData:=_TS_ModuleGetCOMGlobalData( )
   #IFDEF TS_COMGLOBALDATA_CRITICALSECTION
      EnterCriticalSection( oCOMGlobalData:_COMGGeneralPurposeSection )
   #ENDIF
   DO CASE
   CASE SELF:_Gets==0U
      TSTrace Warning "SELF:_Gets==0U"
      IF poAIUnknown<>NULL_PTR
         OBJECT( PTR( _CAST, poAIUnknown ) ):=NULL_OBJECT
      ELSE
         TSTrace Warning "poAIUnknown==NULL_PTR"
      END
      hResult:=E_FAIL
   CASE SELF:FInit
      SELF:_Gets-=1U
      IF SELF:_Gets==0U
         SELF:_VT:=VT_EMPTY
      END
      IF TS_ValidQueryInterfaceRequest( SELF:_AIUnknown, pStruIID ; ...
     ... , poAIUnknown, @hResult )
         #IFDEF TS_TRACETIMED_ENABLE
            _TS_TraceTimedEnter( TS_TT_SYM_EXTERNAL, TS_TT_SYM_IUNKNOWN, #QueryInterface  ; ...
           ... )
         #ENDIF
         hResult:=SELF:_AIUnknown:QueryInterface( pStruIID ; ...
        ... , poAIUnknown )
         #IFDEF TS_TRACETIMED_ENABLE
            _TS_TraceTimedLeave( TS_TT_SYM_EXTERNAL, TS_TT_SYM_IUNKNOWN, #QueryInterface  ; ...
           ... )
         #ENDIF
         DO CASE
         CASE hResult==E_NOINTERFACE
            IF TS_ShowNotSupportedInterfaces( )
               TS_DebOutSTRING( "Interface '"+TS_GUID2String( pStruIID )+"' not supported"  ; ...
              ... )
            END
            OBJECT( PTR( _CAST, poAIUnknown ) ):=NULL_OBJECT
         CASE TS_HFailed( hResult, TRUE )
            TSTrace Warning "SELF:_AIUnknown:QueryInterface(pStruIID,poAIUnknown)"
            OBJECT( PTR( _CAST, poAIUnknown ) ):=NULL_OBJECT
         END
      ELSE
         TSTrace Warning "!TS_ValidQueryInterfaceRequest(SELF:_AIUnknown,pStruIID" ; ...
        ... +",poAIUnknown,@hResult)"
      END
      IF SELF:_Gets==0U
         oAIUnknown:=SELF:_AIUnknown
         SELF:_AIUnknown:=NULL_OBJECT
         IF oAIUnknown<>NULL_OBJECT
            #IFDEF TS_TRACETIMED_ENABLE
               _TS_TraceTimedEnter( TS_TT_SYM_EXTERNAL, TS_TT_SYM_IUNKNOWN, #Release  ; ...
              ... )
            #ENDIF
            oAIUnknown:Release( )
            #IFDEF TS_TRACETIMED_ENABLE
               _TS_TraceTimedLeave( TS_TT_SYM_EXTERNAL, TS_TT_SYM_IUNKNOWN, #Release  ; ...
              ... )
            #ENDIF
            oAIUnknown:=NULL_OBJECT
         END
      END
   OTHERWISE
      TSTrace Warning "!SELF:FInit"
      IF poAIUnknown<>NULL_PTR
         OBJECT( PTR( _CAST, poAIUnknown ) ):=NULL_OBJECT
      ELSE
         TSTrace Warning "poAIUnknown==NULL_PTR"
      END
      hResult:=E_FAIL
   END
   #IFDEF TS_COMGLOBALDATA_CRITICALSECTION
      LeaveCriticalSection( oCOMGlobalData:_COMGGeneralPurposeSection )
   #ENDIF
   TSTrace Leave
RETURN hResult