Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Base / MS / Internal / interop / ErrorCodes.cs / 1305600 / ErrorCodes.cs
/**************************************************************************\
Copyright Microsoft Corporation. All Rights Reserved.
\**************************************************************************/
namespace MS.Internal.Interop
{
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
///
/// Wrapper for common Win32 status codes.
///
[StructLayout(LayoutKind.Explicit)]
internal struct Win32Error
{
[FieldOffset(0)]
private readonly int _value;
// NOTE: These public static field declarations are automatically
// picked up by (HRESULT's) ToString through reflection.
/// The operation completed successfully.
public static readonly Win32Error ERROR_SUCCESS = new Win32Error(0);
/// Incorrect function.
public static readonly Win32Error ERROR_INVALID_FUNCTION = new Win32Error(1);
/// The system cannot find the file specified.
public static readonly Win32Error ERROR_FILE_NOT_FOUND = new Win32Error(2);
/// The system cannot find the path specified.
public static readonly Win32Error ERROR_PATH_NOT_FOUND = new Win32Error(3);
/// The system cannot open the file.
public static readonly Win32Error ERROR_TOO_MANY_OPEN_FILES = new Win32Error(4);
/// Access is denied.
public static readonly Win32Error ERROR_ACCESS_DENIED = new Win32Error(5);
/// The handle is invalid.
public static readonly Win32Error ERROR_INVALID_HANDLE = new Win32Error(6);
/// Not enough storage is available to complete this operation.
public static readonly Win32Error ERROR_OUTOFMEMORY = new Win32Error(14);
/// There are no more files.
public static readonly Win32Error ERROR_NO_MORE_FILES = new Win32Error(18);
/// The process cannot access the file because it is being used by another process.
public static readonly Win32Error ERROR_SHARING_VIOLATION = new Win32Error(32);
/// The parameter is incorrect.
public static readonly Win32Error ERROR_INVALID_PARAMETER = new Win32Error(87);
/// The data area passed to a system call is too small.
public static readonly Win32Error ERROR_INSUFFICIENT_BUFFER = new Win32Error(122);
/// Cannot nest calls to LoadModule.
public static readonly Win32Error ERROR_NESTING_NOT_ALLOWED = new Win32Error(215);
/// Illegal operation attempted on a registry key that has been marked for deletion.
public static readonly Win32Error ERROR_KEY_DELETED = new Win32Error(1018);
/// There was no match for the specified key in the index.
public static readonly Win32Error ERROR_NO_MATCH = new Win32Error(1169);
/// An invalid device was specified.
public static readonly Win32Error ERROR_BAD_DEVICE = new Win32Error(1200);
/// The operation was canceled by the user.
public static readonly Win32Error ERROR_CANCELLED = new Win32Error(1223);
/// Invalid window handle.
public static readonly Win32Error ERROR_INVALID_WINDOW_HANDLE = new Win32Error(1400);
/// This operation returned because the timeout period expired.
public static readonly Win32Error ERROR_TIMEOUT = new Win32Error(1460);
/// The specified datatype is invalid.
public static readonly Win32Error ERROR_INVALID_DATATYPE = new Win32Error(1804);
///
/// Create a new Win32 error.
///
/// The integer value of the error.
public Win32Error(int i)
{
_value = i;
}
/// Performs HRESULT_FROM_WIN32 conversion.
/// The Win32 error being converted to an HRESULT.
/// The equivilent HRESULT value.
public static explicit operator HRESULT(Win32Error error)
{
// #define __HRESULT_FROM_WIN32(x)
// ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))
if (error._value <= 0)
{
return new HRESULT((uint)error._value);
}
return HRESULT.Make(true, Facility.Win32, error._value & 0x0000FFFF);
}
// Method version of the cast operator.
/// Performs HRESULT_FROM_WIN32 conversion.
/// The Win32 error being converted to an HRESULT.
/// The equivilent HRESULT value.
public HRESULT ToHRESULT()
{
return (HRESULT)this;
}
/// Performs the equivalent of Win32's GetLastError()
/// A Win32Error instance with the result of the native GetLastError
public static Win32Error GetLastError()
{
return new Win32Error(Marshal.GetLastWin32Error());
}
public override bool Equals(object obj)
{
try
{
return ((Win32Error)obj)._value == _value;
}
catch (InvalidCastException)
{
return false;
}
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
///
/// Compare two Win32 error codes for equality.
///
/// The first error code to compare.
/// The second error code to compare.
/// Whether the two error codes are the same.
public static bool operator ==(Win32Error errLeft, Win32Error errRight)
{
return errLeft._value == errRight._value;
}
///
/// Compare two Win32 error codes for inequality.
///
/// The first error code to compare.
/// The second error code to compare.
/// Whether the two error codes are not the same.
public static bool operator !=(Win32Error errLeft, Win32Error errRight)
{
return !(errLeft == errRight);
}
}
internal enum Facility
{
/// FACILITY_NULL
Null = 0,
/// FACILITY_RPC
Rpc = 1,
/// FACILITY_DISPATCH
Dispatch = 2,
/// FACILITY_STORAGE
Storage = 3,
/// FACILITY_ITF
Itf = 4,
/// FACILITY_WIN32
Win32 = 7,
/// FACILITY_WINDOWS
Windows = 8,
/// FACILITY_CONTROL
Control = 10,
/// MSDN doced facility code for ESE errors.
Ese = 0xE5E,
}
/// Wrapper for HRESULT status codes.
[StructLayout(LayoutKind.Explicit)]
internal struct HRESULT
{
[FieldOffset(0)]
private readonly uint _value;
// NOTE: These public static field declarations are automatically
// picked up by ToString through reflection.
/// S_OK
public static readonly HRESULT S_OK = new HRESULT(0x00000000);
/// S_FALSE
public static readonly HRESULT S_FALSE = new HRESULT(0x00000001);
/// E_NOTIMPL
public static readonly HRESULT E_NOTIMPL = new HRESULT(0x80004001);
/// E_NOINTERFACE
public static readonly HRESULT E_NOINTERFACE = new HRESULT(0x80004002);
/// E_POINTER
public static readonly HRESULT E_POINTER = new HRESULT(0x80004003);
/// E_ABORT
public static readonly HRESULT E_ABORT = new HRESULT(0x80004004);
/// E_FAIL
public static readonly HRESULT E_FAIL = new HRESULT(0x80004005);
/// E_UNEXPECTED
public static readonly HRESULT E_UNEXPECTED = new HRESULT(0x8000FFFF);
/// DISP_E_MEMBERNOTFOUND
public static readonly HRESULT DISP_E_MEMBERNOTFOUND = new HRESULT(0x80020003);
/// DISP_E_TYPEMISMATCH
public static readonly HRESULT DISP_E_TYPEMISMATCH = new HRESULT(0x80020005);
/// DISP_E_UNKNOWNNAME
public static readonly HRESULT DISP_E_UNKNOWNNAME = new HRESULT(0x80020006);
/// DISP_E_EXCEPTION
public static readonly HRESULT DISP_E_EXCEPTION = new HRESULT(0x80020009);
/// DISP_E_OVERFLOW
public static readonly HRESULT DISP_E_OVERFLOW = new HRESULT(0x8002000A);
/// DISP_E_BADINDEX
public static readonly HRESULT DISP_E_BADINDEX = new HRESULT(0x8002000B);
/// DISP_E_BADPARAMCOUNT
public static readonly HRESULT DISP_E_BADPARAMCOUNT = new HRESULT(0x8002000E);
/// DISP_E_PARAMNOTOPTIONAL
public static readonly HRESULT DISP_E_PARAMNOTOPTIONAL = new HRESULT(0x8002000F);
/// SCRIPT_E_REPORTED
public static readonly HRESULT SCRIPT_E_REPORTED = new HRESULT(0x80020101);
/// STG_E_INVALIDFUNCTION
public static readonly HRESULT STG_E_INVALIDFUNCTION = new HRESULT(0x80030001);
/// DESTS_E_NO_MATCHING_ASSOC_HANDLER.
///
/// Win7 error code for Jump Lists. There is no associated handler for the given item registered by the specified application.
///
public static readonly HRESULT DESTS_E_NO_MATCHING_ASSOC_HANDLER = new HRESULT(0x80040F03);
/// E_ACCESSDENIED
public static readonly HRESULT E_ACCESSDENIED = new HRESULT(0x80070005);
/// E_OUTOFMEMORY
public static readonly HRESULT E_OUTOFMEMORY = new HRESULT(0x8007000E);
/// E_INVALIDARG
public static readonly HRESULT E_INVALIDARG = new HRESULT(0x80070057);
/// COR_E_OBJECTDISPOSED
public static readonly HRESULT COR_E_OBJECTDISPOSED = new HRESULT(0x80131622);
/// WC_E_GREATERTHAN
public static readonly HRESULT WC_E_GREATERTHAN = new HRESULT(0xC00CEE23);
/// WC_E_SYNTAX
public static readonly HRESULT WC_E_SYNTAX = new HRESULT(0xC00CEE2D);
///
/// Create an HRESULT from an integer value.
///
///
public HRESULT(uint i)
{
_value = i;
}
public static HRESULT Make(bool severe, Facility facility, int code)
{
//#define MAKE_HRESULT(sev,fac,code) \
// ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )
return new HRESULT((uint)((severe ? (1 << 31) : 0) | ((int)facility << 16) | code));
}
///
/// retrieve HRESULT_FACILITY
///
public Facility Facility
{
get
{
return GetFacility((int)_value);
}
}
public static Facility GetFacility(int errorCode)
{
// #define HRESULT_FACILITY(hr) (((hr) >> 16) & 0x1fff)
return (Facility)((errorCode >> 16) & 0x1fff);
}
///
/// retrieve HRESULT_CODE
///
public int Code
{
get
{
return GetCode((int)_value);
}
}
public static int GetCode(int error)
{
// #define HRESULT_CODE(hr) ((hr) & 0xFFFF)
return (int)(error & 0xFFFF);
}
#region Object class override members
///
/// Get a string representation of this HRESULT.
///
///
public override string ToString()
{
// Use reflection to try to name this HRESULT.
// This is expensive, but if someone's ever printing HRESULT strings then
// I think it's a fair guess that they're not in a performance critical area
// (e.g. printing exception strings).
// This is less error prone than trying to keep the list in the function.
// To properly add an HRESULT's name to the ToString table, just add the HRESULT
// like all the others above.
//
//
foreach (FieldInfo publicStaticField in typeof(HRESULT).GetFields(BindingFlags.Static | BindingFlags.Public))
{
if (publicStaticField.FieldType == typeof(HRESULT))
{
var hr = (HRESULT)publicStaticField.GetValue(null);
if (hr == this)
{
return publicStaticField.Name;
}
}
}
// Try Win32 error codes also
if (Facility == Facility.Win32)
{
foreach (FieldInfo publicStaticField in typeof(Win32Error).GetFields(BindingFlags.Static | BindingFlags.Public))
{
if (publicStaticField.FieldType == typeof(Win32Error))
{
var error = (Win32Error)publicStaticField.GetValue(null);
if ((HRESULT)error == this)
{
return "HRESULT_FROM_WIN32(" + publicStaticField.Name + ")";
}
}
}
}
// If there's no good name for this HRESULT,
// return the string as readable hex (0x########) format.
return string.Format(CultureInfo.InvariantCulture, "0x{0:X8}", _value);
}
public override bool Equals(object obj)
{
try
{
return ((HRESULT)obj)._value == _value;
}
catch (InvalidCastException)
{
return false;
}
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
#endregion
public static bool operator ==(HRESULT hrLeft, HRESULT hrRight)
{
return hrLeft._value == hrRight._value;
}
public static bool operator !=(HRESULT hrLeft, HRESULT hrRight)
{
return !(hrLeft == hrRight);
}
public bool Succeeded
{
get { return (int)_value >= 0; }
}
public bool Failed
{
get { return (int)_value < 0; }
}
public void ThrowIfFailed()
{
ThrowIfFailed(null);
}
///
/// Critical - Calls critical Marshal method GetExceptionForHR.
/// TreatAsSafe - Callers can't gain additional information they didn't already have.
/// This is just throwing an exception.
///
[SecurityCritical, SecurityTreatAsSafe]
public void ThrowIfFailed(string message)
{
Exception e = GetException(message);
if (e != null)
{
throw e;
}
}
public Exception GetException()
{
return GetException(null);
}
///
/// Critical - Calls critical Marshal method GetExceptionForHR.
/// TreatAsSafe - Callers can't gain additional information they didn't already have.
/// This is just getting an exception object.
///
[SecurityCritical, SecurityTreatAsSafe]
public Exception GetException(string message)
{
if (!Failed)
{
return null;
}
// If you're throwing an exception I assume it's OK for me to take some time to give it back.
// I want to convert the HRESULT to a more appropriate exception type than COMException.
// Marshal.ThrowExceptionForHR does this for me, but the general call uses GetErrorInfo
// if it's set, and then ignores the HRESULT that I've provided. This makes it so this
// call works the first time but you get burned on the second. To avoid this, I use
// the overload that explicitly ignores the IErrorInfo.
// In addition, the function doesn't allow me to set the Message unless I go through
// the process of implementing an IErrorInfo and then use that. There's no stock
// implementations of IErrorInfo available and I don't think it's worth the maintenance
// overhead of doing it, nor would it have significant value over this approach.
Exception e = Marshal.GetExceptionForHR((int)_value, new IntPtr(-1));
Debug.Assert(e != null);
// ArgumentNullException doesn't have the right constructor parameters,
// (nor does Win32Exception...)
// but E_POINTER gets mapped to NullReferenceException,
// so I don't think it will ever matter.
Debug.Assert(!(e is ArgumentNullException));
// If we're not getting anything better than a COMException from Marshal,
// then at least check the facility and attempt to do better ourselves.
if (e.GetType() == typeof(COMException))
{
switch (Facility)
{
case Facility.Win32:
// Win32Exception generates default messages based on the error type.
// Don't override this behavior if the caller didn't explicitly
// specify something more appropriate.
if (string.IsNullOrEmpty(message))
{
e = new Win32Exception(Code);
}
else
{
e = new Win32Exception(Code, message);
}
break;
default:
e = new COMException(message ?? e.Message, (int)_value);
break;
}
}
else
{
// Replace the message if we have something better.
if (!string.IsNullOrEmpty(message))
{
ConstructorInfo cons = e.GetType().GetConstructor(new[] { typeof(string) });
if (null != cons)
{
e = cons.Invoke(new object[] { message }) as Exception;
Debug.Assert(e != null);
}
}
}
return e;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
/**************************************************************************\
Copyright Microsoft Corporation. All Rights Reserved.
\**************************************************************************/
namespace MS.Internal.Interop
{
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
///
/// Wrapper for common Win32 status codes.
///
[StructLayout(LayoutKind.Explicit)]
internal struct Win32Error
{
[FieldOffset(0)]
private readonly int _value;
// NOTE: These public static field declarations are automatically
// picked up by (HRESULT's) ToString through reflection.
/// The operation completed successfully.
public static readonly Win32Error ERROR_SUCCESS = new Win32Error(0);
/// Incorrect function.
public static readonly Win32Error ERROR_INVALID_FUNCTION = new Win32Error(1);
/// The system cannot find the file specified.
public static readonly Win32Error ERROR_FILE_NOT_FOUND = new Win32Error(2);
/// The system cannot find the path specified.
public static readonly Win32Error ERROR_PATH_NOT_FOUND = new Win32Error(3);
/// The system cannot open the file.
public static readonly Win32Error ERROR_TOO_MANY_OPEN_FILES = new Win32Error(4);
/// Access is denied.
public static readonly Win32Error ERROR_ACCESS_DENIED = new Win32Error(5);
/// The handle is invalid.
public static readonly Win32Error ERROR_INVALID_HANDLE = new Win32Error(6);
/// Not enough storage is available to complete this operation.
public static readonly Win32Error ERROR_OUTOFMEMORY = new Win32Error(14);
/// There are no more files.
public static readonly Win32Error ERROR_NO_MORE_FILES = new Win32Error(18);
/// The process cannot access the file because it is being used by another process.
public static readonly Win32Error ERROR_SHARING_VIOLATION = new Win32Error(32);
/// The parameter is incorrect.
public static readonly Win32Error ERROR_INVALID_PARAMETER = new Win32Error(87);
/// The data area passed to a system call is too small.
public static readonly Win32Error ERROR_INSUFFICIENT_BUFFER = new Win32Error(122);
/// Cannot nest calls to LoadModule.
public static readonly Win32Error ERROR_NESTING_NOT_ALLOWED = new Win32Error(215);
/// Illegal operation attempted on a registry key that has been marked for deletion.
public static readonly Win32Error ERROR_KEY_DELETED = new Win32Error(1018);
/// There was no match for the specified key in the index.
public static readonly Win32Error ERROR_NO_MATCH = new Win32Error(1169);
/// An invalid device was specified.
public static readonly Win32Error ERROR_BAD_DEVICE = new Win32Error(1200);
/// The operation was canceled by the user.
public static readonly Win32Error ERROR_CANCELLED = new Win32Error(1223);
/// Invalid window handle.
public static readonly Win32Error ERROR_INVALID_WINDOW_HANDLE = new Win32Error(1400);
/// This operation returned because the timeout period expired.
public static readonly Win32Error ERROR_TIMEOUT = new Win32Error(1460);
/// The specified datatype is invalid.
public static readonly Win32Error ERROR_INVALID_DATATYPE = new Win32Error(1804);
///
/// Create a new Win32 error.
///
/// The integer value of the error.
public Win32Error(int i)
{
_value = i;
}
/// Performs HRESULT_FROM_WIN32 conversion.
/// The Win32 error being converted to an HRESULT.
/// The equivilent HRESULT value.
public static explicit operator HRESULT(Win32Error error)
{
// #define __HRESULT_FROM_WIN32(x)
// ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))
if (error._value <= 0)
{
return new HRESULT((uint)error._value);
}
return HRESULT.Make(true, Facility.Win32, error._value & 0x0000FFFF);
}
// Method version of the cast operator.
/// Performs HRESULT_FROM_WIN32 conversion.
/// The Win32 error being converted to an HRESULT.
/// The equivilent HRESULT value.
public HRESULT ToHRESULT()
{
return (HRESULT)this;
}
/// Performs the equivalent of Win32's GetLastError()
/// A Win32Error instance with the result of the native GetLastError
public static Win32Error GetLastError()
{
return new Win32Error(Marshal.GetLastWin32Error());
}
public override bool Equals(object obj)
{
try
{
return ((Win32Error)obj)._value == _value;
}
catch (InvalidCastException)
{
return false;
}
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
///
/// Compare two Win32 error codes for equality.
///
/// The first error code to compare.
/// The second error code to compare.
/// Whether the two error codes are the same.
public static bool operator ==(Win32Error errLeft, Win32Error errRight)
{
return errLeft._value == errRight._value;
}
///
/// Compare two Win32 error codes for inequality.
///
/// The first error code to compare.
/// The second error code to compare.
/// Whether the two error codes are not the same.
public static bool operator !=(Win32Error errLeft, Win32Error errRight)
{
return !(errLeft == errRight);
}
}
internal enum Facility
{
/// FACILITY_NULL
Null = 0,
/// FACILITY_RPC
Rpc = 1,
/// FACILITY_DISPATCH
Dispatch = 2,
/// FACILITY_STORAGE
Storage = 3,
/// FACILITY_ITF
Itf = 4,
/// FACILITY_WIN32
Win32 = 7,
/// FACILITY_WINDOWS
Windows = 8,
/// FACILITY_CONTROL
Control = 10,
/// MSDN doced facility code for ESE errors.
Ese = 0xE5E,
}
/// Wrapper for HRESULT status codes.
[StructLayout(LayoutKind.Explicit)]
internal struct HRESULT
{
[FieldOffset(0)]
private readonly uint _value;
// NOTE: These public static field declarations are automatically
// picked up by ToString through reflection.
/// S_OK
public static readonly HRESULT S_OK = new HRESULT(0x00000000);
/// S_FALSE
public static readonly HRESULT S_FALSE = new HRESULT(0x00000001);
/// E_NOTIMPL
public static readonly HRESULT E_NOTIMPL = new HRESULT(0x80004001);
/// E_NOINTERFACE
public static readonly HRESULT E_NOINTERFACE = new HRESULT(0x80004002);
/// E_POINTER
public static readonly HRESULT E_POINTER = new HRESULT(0x80004003);
/// E_ABORT
public static readonly HRESULT E_ABORT = new HRESULT(0x80004004);
/// E_FAIL
public static readonly HRESULT E_FAIL = new HRESULT(0x80004005);
/// E_UNEXPECTED
public static readonly HRESULT E_UNEXPECTED = new HRESULT(0x8000FFFF);
/// DISP_E_MEMBERNOTFOUND
public static readonly HRESULT DISP_E_MEMBERNOTFOUND = new HRESULT(0x80020003);
/// DISP_E_TYPEMISMATCH
public static readonly HRESULT DISP_E_TYPEMISMATCH = new HRESULT(0x80020005);
/// DISP_E_UNKNOWNNAME
public static readonly HRESULT DISP_E_UNKNOWNNAME = new HRESULT(0x80020006);
/// DISP_E_EXCEPTION
public static readonly HRESULT DISP_E_EXCEPTION = new HRESULT(0x80020009);
/// DISP_E_OVERFLOW
public static readonly HRESULT DISP_E_OVERFLOW = new HRESULT(0x8002000A);
/// DISP_E_BADINDEX
public static readonly HRESULT DISP_E_BADINDEX = new HRESULT(0x8002000B);
/// DISP_E_BADPARAMCOUNT
public static readonly HRESULT DISP_E_BADPARAMCOUNT = new HRESULT(0x8002000E);
/// DISP_E_PARAMNOTOPTIONAL
public static readonly HRESULT DISP_E_PARAMNOTOPTIONAL = new HRESULT(0x8002000F);
/// SCRIPT_E_REPORTED
public static readonly HRESULT SCRIPT_E_REPORTED = new HRESULT(0x80020101);
/// STG_E_INVALIDFUNCTION
public static readonly HRESULT STG_E_INVALIDFUNCTION = new HRESULT(0x80030001);
/// DESTS_E_NO_MATCHING_ASSOC_HANDLER.
///
/// Win7 error code for Jump Lists. There is no associated handler for the given item registered by the specified application.
///
public static readonly HRESULT DESTS_E_NO_MATCHING_ASSOC_HANDLER = new HRESULT(0x80040F03);
/// E_ACCESSDENIED
public static readonly HRESULT E_ACCESSDENIED = new HRESULT(0x80070005);
/// E_OUTOFMEMORY
public static readonly HRESULT E_OUTOFMEMORY = new HRESULT(0x8007000E);
/// E_INVALIDARG
public static readonly HRESULT E_INVALIDARG = new HRESULT(0x80070057);
/// COR_E_OBJECTDISPOSED
public static readonly HRESULT COR_E_OBJECTDISPOSED = new HRESULT(0x80131622);
/// WC_E_GREATERTHAN
public static readonly HRESULT WC_E_GREATERTHAN = new HRESULT(0xC00CEE23);
/// WC_E_SYNTAX
public static readonly HRESULT WC_E_SYNTAX = new HRESULT(0xC00CEE2D);
///
/// Create an HRESULT from an integer value.
///
///
public HRESULT(uint i)
{
_value = i;
}
public static HRESULT Make(bool severe, Facility facility, int code)
{
//#define MAKE_HRESULT(sev,fac,code) \
// ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )
return new HRESULT((uint)((severe ? (1 << 31) : 0) | ((int)facility << 16) | code));
}
///
/// retrieve HRESULT_FACILITY
///
public Facility Facility
{
get
{
return GetFacility((int)_value);
}
}
public static Facility GetFacility(int errorCode)
{
// #define HRESULT_FACILITY(hr) (((hr) >> 16) & 0x1fff)
return (Facility)((errorCode >> 16) & 0x1fff);
}
///
/// retrieve HRESULT_CODE
///
public int Code
{
get
{
return GetCode((int)_value);
}
}
public static int GetCode(int error)
{
// #define HRESULT_CODE(hr) ((hr) & 0xFFFF)
return (int)(error & 0xFFFF);
}
#region Object class override members
///
/// Get a string representation of this HRESULT.
///
///
public override string ToString()
{
// Use reflection to try to name this HRESULT.
// This is expensive, but if someone's ever printing HRESULT strings then
// I think it's a fair guess that they're not in a performance critical area
// (e.g. printing exception strings).
// This is less error prone than trying to keep the list in the function.
// To properly add an HRESULT's name to the ToString table, just add the HRESULT
// like all the others above.
//
//
foreach (FieldInfo publicStaticField in typeof(HRESULT).GetFields(BindingFlags.Static | BindingFlags.Public))
{
if (publicStaticField.FieldType == typeof(HRESULT))
{
var hr = (HRESULT)publicStaticField.GetValue(null);
if (hr == this)
{
return publicStaticField.Name;
}
}
}
// Try Win32 error codes also
if (Facility == Facility.Win32)
{
foreach (FieldInfo publicStaticField in typeof(Win32Error).GetFields(BindingFlags.Static | BindingFlags.Public))
{
if (publicStaticField.FieldType == typeof(Win32Error))
{
var error = (Win32Error)publicStaticField.GetValue(null);
if ((HRESULT)error == this)
{
return "HRESULT_FROM_WIN32(" + publicStaticField.Name + ")";
}
}
}
}
// If there's no good name for this HRESULT,
// return the string as readable hex (0x########) format.
return string.Format(CultureInfo.InvariantCulture, "0x{0:X8}", _value);
}
public override bool Equals(object obj)
{
try
{
return ((HRESULT)obj)._value == _value;
}
catch (InvalidCastException)
{
return false;
}
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
#endregion
public static bool operator ==(HRESULT hrLeft, HRESULT hrRight)
{
return hrLeft._value == hrRight._value;
}
public static bool operator !=(HRESULT hrLeft, HRESULT hrRight)
{
return !(hrLeft == hrRight);
}
public bool Succeeded
{
get { return (int)_value >= 0; }
}
public bool Failed
{
get { return (int)_value < 0; }
}
public void ThrowIfFailed()
{
ThrowIfFailed(null);
}
///
/// Critical - Calls critical Marshal method GetExceptionForHR.
/// TreatAsSafe - Callers can't gain additional information they didn't already have.
/// This is just throwing an exception.
///
[SecurityCritical, SecurityTreatAsSafe]
public void ThrowIfFailed(string message)
{
Exception e = GetException(message);
if (e != null)
{
throw e;
}
}
public Exception GetException()
{
return GetException(null);
}
///
/// Critical - Calls critical Marshal method GetExceptionForHR.
/// TreatAsSafe - Callers can't gain additional information they didn't already have.
/// This is just getting an exception object.
///
[SecurityCritical, SecurityTreatAsSafe]
public Exception GetException(string message)
{
if (!Failed)
{
return null;
}
// If you're throwing an exception I assume it's OK for me to take some time to give it back.
// I want to convert the HRESULT to a more appropriate exception type than COMException.
// Marshal.ThrowExceptionForHR does this for me, but the general call uses GetErrorInfo
// if it's set, and then ignores the HRESULT that I've provided. This makes it so this
// call works the first time but you get burned on the second. To avoid this, I use
// the overload that explicitly ignores the IErrorInfo.
// In addition, the function doesn't allow me to set the Message unless I go through
// the process of implementing an IErrorInfo and then use that. There's no stock
// implementations of IErrorInfo available and I don't think it's worth the maintenance
// overhead of doing it, nor would it have significant value over this approach.
Exception e = Marshal.GetExceptionForHR((int)_value, new IntPtr(-1));
Debug.Assert(e != null);
// ArgumentNullException doesn't have the right constructor parameters,
// (nor does Win32Exception...)
// but E_POINTER gets mapped to NullReferenceException,
// so I don't think it will ever matter.
Debug.Assert(!(e is ArgumentNullException));
// If we're not getting anything better than a COMException from Marshal,
// then at least check the facility and attempt to do better ourselves.
if (e.GetType() == typeof(COMException))
{
switch (Facility)
{
case Facility.Win32:
// Win32Exception generates default messages based on the error type.
// Don't override this behavior if the caller didn't explicitly
// specify something more appropriate.
if (string.IsNullOrEmpty(message))
{
e = new Win32Exception(Code);
}
else
{
e = new Win32Exception(Code, message);
}
break;
default:
e = new COMException(message ?? e.Message, (int)_value);
break;
}
}
else
{
// Replace the message if we have something better.
if (!string.IsNullOrEmpty(message))
{
ConstructorInfo cons = e.GetType().GetConstructor(new[] { typeof(string) });
if (null != cons)
{
e = cons.Invoke(new object[] { message }) as Exception;
Debug.Assert(e != null);
}
}
}
return e;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ImageIndexEditor.cs
- WriteableBitmap.cs
- DataGridViewControlCollection.cs
- BlurBitmapEffect.cs
- SaveFileDialog.cs
- GetPageNumberCompletedEventArgs.cs
- GenerateTemporaryTargetAssembly.cs
- SoapReflectionImporter.cs
- PropVariant.cs
- Trace.cs
- ColumnMap.cs
- HwndSourceKeyboardInputSite.cs
- SerializationStore.cs
- Trigger.cs
- NativeCppClassAttribute.cs
- XmlQueryType.cs
- XmlSchemaCollection.cs
- MexHttpsBindingCollectionElement.cs
- CqlLexerHelpers.cs
- StyleModeStack.cs
- Logging.cs
- CharAnimationUsingKeyFrames.cs
- MethodBuilderInstantiation.cs
- IfAction.cs
- EntityCollection.cs
- DataGridView.cs
- StreamInfo.cs
- sqlser.cs
- RelationshipEndCollection.cs
- objectquery_tresulttype.cs
- DataGridViewCellContextMenuStripNeededEventArgs.cs
- ObjectViewQueryResultData.cs
- ClientUrlResolverWrapper.cs
- DrawingCollection.cs
- OdbcConnection.cs
- PersonalizationAdministration.cs
- XsltConvert.cs
- ManagedFilter.cs
- VisualTreeHelper.cs
- NumberFunctions.cs
- ParentQuery.cs
- CodeStatement.cs
- DataReaderContainer.cs
- AdapterDictionary.cs
- ToolStripScrollButton.cs
- Rfc2898DeriveBytes.cs
- CommentAction.cs
- BufferedStream.cs
- RoutedCommand.cs
- CodeDirectionExpression.cs
- ExternalFile.cs
- ThicknessAnimationUsingKeyFrames.cs
- StrokeNodeEnumerator.cs
- AutomationEventArgs.cs
- ProcessHostServerConfig.cs
- BaseComponentEditor.cs
- DataServiceQueryOfT.cs
- Convert.cs
- GeneralTransform.cs
- ReferenceSchema.cs
- CodeEntryPointMethod.cs
- PropertyDescriptor.cs
- BitmapDecoder.cs
- _SSPISessionCache.cs
- OciEnlistContext.cs
- LocationChangedEventArgs.cs
- MasterPage.cs
- DataGridViewColumnEventArgs.cs
- AttributeUsageAttribute.cs
- ChtmlTextWriter.cs
- Quaternion.cs
- LinkAreaEditor.cs
- DashStyles.cs
- ActivityExecutionFilter.cs
- HeaderCollection.cs
- DefaultPrintController.cs
- BaseServiceProvider.cs
- DelayedRegex.cs
- WindowsSpinner.cs
- ResourceBinder.cs
- GeneralTransform2DTo3DTo2D.cs
- ListViewItemEventArgs.cs
- TransformerInfoCollection.cs
- WebPartActionVerb.cs
- ReachSerializerAsync.cs
- _Semaphore.cs
- NetworkAddressChange.cs
- WindowsGraphicsCacheManager.cs
- BindingCompleteEventArgs.cs
- WhitespaceRuleLookup.cs
- IPEndPoint.cs
- ElementNotAvailableException.cs
- OdbcStatementHandle.cs
- LocalizationComments.cs
- Geometry3D.cs
- DataGridItemAutomationPeer.cs
- ProcessModuleDesigner.cs
- PathFigureCollection.cs
- BufferedGraphicsContext.cs
- FtpWebResponse.cs