|
|
#include "StdAfx.h"
#include "exceptions.h"
void CBaseException::FormatError( UINT nResID, DWORD dwCode ) { WCHAR wszBuffer[ MaxErrorBuff ] = L""; VERIFY( ::LoadStringW( _Module.GetModuleInstance(), nResID, wszBuffer, MaxErrorBuff ) );
FormatError( wszBuffer, dwCode ); }
void CBaseException::FormatError( LPCWSTR wszError, DWORD dwCode ) { _ASSERT( wszError != NULL );
WCHAR wszBuffer1[ MaxErrorBuff ] = L""; WCHAR wszOSError[ MaxErrorBuff ] = L"";
::wcsncpy( wszBuffer1, wszError, MaxErrorBuff ); // Get the OS error info
if ( dwCode != ERROR_SUCCESS ) { WCHAR wszFmt[ MaxErrorBuff ] = L"";
// Load format string from resources
VERIFY( ::LoadStringW( _Module.GetModuleInstance(), IDS_FMO_ERROR, wszFmt, MaxErrorBuff ) );
// For E_FAIL use ErrorInfo
if ( dwCode != E_FAIL ) { VERIFY( ::FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwCode, 0, wszOSError, MaxErrorBuff, NULL ) != 0 ); } else { IErrorInfoPtr spErrorInfo; CComBSTR bstrError;
VERIFY( SUCCEEDED( ::GetErrorInfo( 0, &spErrorInfo ) ) ); VERIFY( SUCCEEDED( spErrorInfo->GetDescription( &bstrError ) ) );
::wcsncpy( wszOSError, bstrError, MaxErrorBuff - 1 ); wszOSError[ MaxErrorBuff - 1 ] = L'\0'; }
_ASSERT( ( ::wcslen( wszError ) + ::wcslen( wszOSError ) + ::wcslen( wszFmt ) ) < MaxErrorBuff );
// Build the final error msg
::_snwprintf( wszBuffer1, MaxErrorBuff - ::wcslen( wszFmt ), wszFmt, wszError, wszOSError ); }
try { m_strError = wszBuffer1; } catch(...) { // Out of memory - nothing to do
}
ATLTRACE( L"\nException occured: %s", wszBuffer1 ); }
// CObjectException implementation
CObjectException::CObjectException( UINT nResID, LPCWSTR wszObject, DWORD dwCode /*=GetLastError()*/ ) { WCHAR wszFmt[ MaxErrorBuff ] = L""; WCHAR wszError[ MaxErrorBuff ] = L""; VERIFY( ::LoadStringW( _Module.GetModuleInstance(), nResID, wszFmt, MaxErrorBuff ) );
_ASSERT( ( ::wcslen( wszObject ) + ::wcslen( wszFmt ) ) < MaxErrorBuff );
::swprintf( wszError, wszFmt, wszObject );
CBaseException::FormatError( wszError, dwCode ); }
CObjectException::CObjectException( UINT nResID, LPCWSTR wszObject1, LPCWSTR wszObject2, DWORD dwCode /*= ::GetLastError()*/ ) { WCHAR wszFmt[ CBaseException::MaxErrorBuff ] = L""; WCHAR wszError[ CBaseException::MaxErrorBuff ] = L""; VERIFY( ::LoadStringW( _Module.GetModuleInstance(), nResID, wszFmt, MaxErrorBuff ) );
_ASSERT( ( ::wcslen( wszObject2 ) + ::wcslen( wszObject1 ) + ::wcslen( wszFmt ) ) < CBaseException::MaxErrorBuff );
::swprintf( wszError, wszFmt, wszObject1, wszObject2 );
CBaseException::FormatError( wszError, dwCode ); }
|