#include <comdef.h>
// Defines
#define SS_COM_TRY try {
#define SS_COM_ENDTRY(rv) rv = S_OK; } catch(_com_error comErr) { rv = comErr.Error(); } /
catch(HRESULT nrv) { rv = nrv; } /
catch(...) { rv = E_FAIL; }
#define SS_COM_ENDTRY_Null } catch(...) {}
#define SS_COM_EXCEPTION(rv) throw ((HRESULT)rv)
#define SS_COM_BAD_COMPTR(x) ((x) == NULL)
#define SS_COM_BAD_RESULT(x) (FAILED(x))
#define SS_COM_VALID_COMPTR(x) (!SS_COM_BAD_COMPTR(x))
#define SS_COM_VALID_RESULT(x) (!SS_COM_BAD_RESULT(x))
#define SS_COM_CHECK_COMPTR(x) if(SS_COM_BAD_COMPTR(x)) SS_COM_EXCEPTION(E_FAIL)
#define SS_COM_CHECK_RESULT(x) if(SS_COM_BAD_RESULT(x)) SS_COM_EXCEPTION(x)
// If check failed, then call the cmd
#define SS_COM_CHECK_COMPTR_CMD(x, cmd) if(SS_COM_BAD_COMPTR(x)) ##cmd
#define SS_COM_CHECK_RESULT_CMD(x, cmd) if(SS_COM_BAD_RESULT(x)) ##cmd