Замена для AfxConnectionAdvise
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 20.08.02 04:11
Оценка:
CErrCodeMsg используется только для вывода в TRACE.

/////////////////////////////////////////////////////////////////////////////
// piAfxConnectionAdvise
// в отличии от стандартной MFC-шной AfxConnectionAdvise,которая возвращает
// только BOOL-результат piAfxConnectionAdvise при ошибках
// устанавливает LastError,  чтобы после неудачного завершения можно
// было установить причину вызвав GetLastError()
BOOL piAfxConnectionAdvise( LPUNKNOWN pUnkSrc, REFIID iid,
                            LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD* pdwCookie )
{
    ASSERT_POINTER( pUnkSrc, IUnknown );
    ASSERT_POINTER( pUnkSink, IUnknown );
    ASSERT_POINTER( pdwCookie, DWORD );

    BOOL bSuccess = FALSE;
    CErrCodeMsg err = 0;
    HRESULT hr;

    LPCONNECTIONPOINTCONTAINER pCPC;

    hr = pUnkSrc->QueryInterface( IID_IConnectionPointContainer, ( LPVOID* ) & pCPC );

    if ( SUCCEEDED( hr ) )
    {
        ASSERT_POINTER( pCPC, IConnectionPointContainer );

        LPCONNECTIONPOINT pCP;

        hr = pCPC->FindConnectionPoint( iid, &pCP );

        if ( SUCCEEDED( hr ) )
        {
            ASSERT_POINTER( pCP, IConnectionPoint );

            hr = pCP->Advise( pUnkSink, pdwCookie );

            if ( SUCCEEDED( hr ) )
                bSuccess = TRUE;
            else
            {
                err = hr;
                SetLastError( hr );
                TRACE( "piAfxConnectionAdvise() - Advise(): ошибка 0x%X: %s", ( DWORD ) err, err.GetString() );
            }

            pCP->Release();

            // The connection point just AddRef'ed us.  If we don't want to
            // keep this reference count (because it would prevent us from
            // being deleted; our reference count wouldn't go to zero), then
            // we need to cancel the effects of the AddRef by calling
            // Release.

            if ( bSuccess && !bRefCount )
                pUnkSink->Release();
        }
        else
        {
            err = hr;
            SetLastError( hr );
            TRACE( "piAfxConnectionAdvise() - FindConnectionPoint(): ошибка 0x%X: %s", ( DWORD ) err, err.GetString() );
        }

        pCPC->Release();
    }
    else
    {
        err = hr;
        SetLastError( hr );
        TRACE( "piAfxConnectionAdvise() - QueryInterface(): ошибка 0x%X: %s", ( DWORD ) err, err.GetString() );
    }

    return bSuccess;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.