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