HRESULT for managed code? HResult!

As usual, comments are welcomed!

HResult.h

#pragma once

namespace Microsoft { namespace MCS { namespace PartnerISV {

using namespace System;

public ref class HResult {

HRESULT _hResult;

String ^_description;

public:

HResult(HRESULT hResult);

HResult(bool severity, UInt16 Severity, UInt16 code);

static HResult ^ FromWin32Error(Int32 win32Error);

property Int32 Value {Int32 get();}

property bool Severity {bool get();}

property UInt16 Facility {UInt16 get();}

property UInt16 Code {UInt16 get();}

property String ^ Description {String ^ get();}

virtual String ^ ToString() override;

};

}}}

 

HResult.cpp

#include "StdAfx.h"

#include "HResult.h"

namespace Microsoft { namespace MCS { namespace PartnerISV {

HResult::HResult(HRESULT hResult)

:_hResult(hResult) {

}

HResult::HResult(bool severity, UInt16 facility, UInt16 code)

:_hResult(MAKE_HRESULT(severity, facility, code)) {

}

HResult ^ HResult::FromWin32Error(Int32 win32Error) {

return gcnew HResult(HRESULT_FROM_WIN32(win32Error));

}

Int32 HResult::Value::get() {

return _hResult;

}

bool HResult::Severity::get() {

return HRESULT_SEVERITY(_hResult);

}

UInt16 HResult::Facility::get() {

return static_cast<UInt16>(HRESULT_FACILITY(_hResult));

}

UInt16 HResult::Code::get() {

return static_cast<UInt16>(HRESULT_CODE(_hResult));

}

String ^ HResult::Description::get() {

if (!_description) {

wchar_t * message = NULL;

try {

if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, _hResult, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPTSTR>(& message), 0, NULL))

_description = gcnew String(message);

else

_description = String::Format( "Cannot get description for HRESULT equal to {0}", _hResult);

} finally {

LocalFree(message);

}

}

return _description;

}

String ^ HResult::ToString() {

return Description;

}

}}}