Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef _INC_COMDEF
      7 #define _INC_COMDEF
      8 
      9 #include <_mingw.h>
     10 
     11 #ifndef RC_INVOKED
     12 
     13 #ifndef __cplusplus
     14 #error Native Compiler support only available in C++ compiler
     15 #endif
     16 
     17 #include <ole2.h>
     18 #include <olectl.h>
     19 #include <comutil.h>
     20 
     21 #ifndef WINAPI
     22 #if defined(_ARM_)
     23 #define WINAPI
     24 #else
     25 #define WINAPI __stdcall
     26 #endif
     27 #endif
     28 
     29 #ifdef __cplusplus
     30 
     31 class _com_error;
     32 void WINAPI _com_raise_error(HRESULT hr,IErrorInfo *perrinfo = 0);
     33 void WINAPI _set_com_error_handler(void (WINAPI *pHandler)(HRESULT hr,IErrorInfo *perrinfo));
     34 void WINAPI _com_issue_errorex(HRESULT,IUnknown*,REFIID);
     35 HRESULT WINAPI _com_dispatch_propget(IDispatch*,DISPID,VARTYPE,void*);
     36 HRESULT __cdecl _com_dispatch_propput(IDispatch*,DISPID,VARTYPE,...);
     37 HRESULT __cdecl _com_dispatch_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...);
     38 HRESULT WINAPI _com_dispatch_raw_propget(IDispatch*,DISPID,VARTYPE,void*) throw();
     39 HRESULT __cdecl _com_dispatch_raw_propput(IDispatch*,DISPID,VARTYPE,...) throw();
     40 HRESULT __cdecl _com_dispatch_raw_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...) throw();
     41 
     42 class _com_error {
     43 public:
     44   _com_error(HRESULT hr,IErrorInfo *perrinfo = NULL,bool fAddRef = false) throw();
     45   _com_error(const _com_error &that) throw();
     46   virtual ~_com_error() throw();
     47   _com_error &operator=(const _com_error &that) throw();
     48   HRESULT Error() const throw();
     49   WORD WCode() const throw();
     50   IErrorInfo *ErrorInfo() const throw();
     51   _bstr_t Description() const;
     52   DWORD HelpContext() const throw();
     53   _bstr_t HelpFile() const;
     54   _bstr_t Source() const;
     55   GUID GUID_() const throw();
     56   const TCHAR *ErrorMessage() const throw();
     57   static HRESULT WCodeToHRESULT(WORD wCode) throw();
     58   static WORD HRESULTToWCode(HRESULT hr) throw();
     59 private:
     60   void Dtor() throw();
     61   void Ctor(const _com_error &that) throw();
     62   enum {
     63     WCODE_HRESULT_FIRST = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x200),WCODE_HRESULT_LAST = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF+1,0) - 1
     64   };
     65   HRESULT m_hresult;
     66   IErrorInfo *m_perrinfo;
     67   mutable TCHAR *m_pszMsg;
     68 };
     69 
     70 inline _com_error::_com_error(HRESULT hr,IErrorInfo *perrinfo,bool fAddRef) throw() : m_hresult(hr),m_perrinfo(perrinfo),m_pszMsg(NULL) {
     71   if(m_perrinfo!=NULL && fAddRef) m_perrinfo->AddRef();
     72 }
     73 
     74 inline _com_error::_com_error(const _com_error &that) throw() {
     75   Ctor(that);
     76 }
     77 
     78 inline _com_error::~_com_error() throw() {
     79 	Dtor();
     80 }
     81 
     82 inline _com_error &_com_error::operator=(const _com_error &that) throw() {
     83   if(this!=&that) {
     84     Dtor();
     85     Ctor(that);
     86   }
     87   return *this;
     88 }
     89 
     90 inline HRESULT _com_error::Error() const throw() { return m_hresult; }
     91 inline WORD _com_error::WCode() const throw() { return HRESULTToWCode(m_hresult); }
     92 
     93 inline IErrorInfo *_com_error::ErrorInfo() const throw() {
     94   if(m_perrinfo!=NULL) m_perrinfo->AddRef();
     95   return m_perrinfo;
     96 }
     97 
     98 inline _bstr_t _com_error::Description() const {
     99   BSTR bstr = NULL;
    100   if(m_perrinfo!=NULL) m_perrinfo->GetDescription(&bstr);
    101   return _bstr_t(bstr,false);
    102 }
    103 
    104 inline DWORD _com_error::HelpContext() const throw() {
    105   DWORD dwHelpContext = 0;
    106   if(m_perrinfo!=NULL) m_perrinfo->GetHelpContext(&dwHelpContext);
    107   return dwHelpContext;
    108 }
    109 
    110 inline _bstr_t _com_error::HelpFile() const {
    111   BSTR bstr = NULL;
    112   if(m_perrinfo!=NULL)  m_perrinfo->GetHelpFile(&bstr);
    113   return _bstr_t(bstr,false);
    114 }
    115 
    116 inline _bstr_t _com_error::Source() const {
    117   BSTR bstr = NULL;
    118   if(m_perrinfo!=NULL) m_perrinfo->GetSource(&bstr);
    119   return _bstr_t(bstr,false);
    120 }
    121 
    122 inline _GUID _com_error::GUID_() const throw() {
    123   _GUID guid;
    124   memset (&guid, 0, sizeof (_GUID));
    125   if(m_perrinfo!=NULL) m_perrinfo->GetGUID(&guid);
    126   return guid;
    127 }
    128 
    129 inline const TCHAR *_com_error::ErrorMessage() const throw() {
    130   if(!m_pszMsg) {
    131     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,m_hresult,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&m_pszMsg,0,NULL);
    132     if(m_pszMsg!=NULL) {
    133       int nLen = lstrlen(m_pszMsg);
    134       if(nLen > 1 && m_pszMsg[nLen - 1]=='\n') {
    135 	m_pszMsg[nLen-1] = 0;
    136 	if(m_pszMsg[nLen - 2]=='\r') m_pszMsg[nLen-2] = 0;
    137       }
    138     } else {
    139       m_pszMsg = (LPTSTR)LocalAlloc(0,32 *sizeof(TCHAR));
    140       if(m_pszMsg!=NULL) {
    141 	WORD wCode = WCode();
    142 	if(wCode!=0) {
    143 	  _COM_PRINTF_S_1(m_pszMsg,32,TEXT("IDispatch error #%d"),wCode);
    144 	} else {
    145 	  _COM_PRINTF_S_1(m_pszMsg,32,TEXT("Unknown error 0x%0lX"),m_hresult);
    146 	}
    147       }
    148     }
    149   }
    150   return m_pszMsg;
    151 }
    152 
    153 inline HRESULT _com_error::WCodeToHRESULT(WORD wCode) throw() { return wCode >= 0xFE00 ? WCODE_HRESULT_LAST : WCODE_HRESULT_FIRST + wCode; }
    154 inline WORD _com_error::HRESULTToWCode(HRESULT hr) throw() { return (hr >= WCODE_HRESULT_FIRST && hr <= WCODE_HRESULT_LAST) ? WORD(hr - WCODE_HRESULT_FIRST) : 0; }
    155 
    156 inline void _com_error::Dtor() throw() {
    157   if(m_perrinfo!=NULL) m_perrinfo->Release();
    158   if(m_pszMsg!=NULL) LocalFree((HLOCAL)m_pszMsg);
    159 }
    160 
    161 inline void _com_error::Ctor(const _com_error &that) throw() {
    162   m_hresult = that.m_hresult;
    163   m_perrinfo = that.m_perrinfo;
    164   m_pszMsg = NULL;
    165   if(m_perrinfo!=NULL) m_perrinfo->AddRef();
    166 }
    167 
    168 inline void _com_issue_error(HRESULT hr) {
    169 #if __EXCEPTIONS
    170     throw _com_error(hr);
    171 #else
    172     /* This is designed to use exceptions. If exceptions are disabled, there is not much we can do here. */
    173     __debugbreak();
    174 #endif
    175 }
    176 
    177 
    178 typedef int __missing_type__;
    179 
    180 #if !defined(_COM_SMARTPTR)
    181 #if !defined(_INC_COMIP)
    182 #include <comip.h>
    183 #endif
    184 #define _COM_SMARTPTR _com_ptr_t
    185 #define _COM_SMARTPTR_LEVEL2 _com_IIID
    186 #endif
    187 #if defined(_COM_SMARTPTR)
    188 #if !defined(_COM_SMARTPTR_TYPEDEF)
    189 #if defined(_COM_SMARTPTR_LEVEL2)
    190 #ifdef __CRT_UUID_DECL
    191 /* With our __uuidof, its result can't be passed directly as a template argument. We have _com_IIID_getter to work around that. */
    192 #define _COM_SMARTPTR_TYPEDEF(Interface,aIID) inline const IID &__##Interface##_IID_getter(void) { return aIID; } typedef _COM_SMARTPTR< _com_IIID_getter<Interface, __##Interface##_IID_getter > > Interface ## Ptr
    193 #else
    194 #define _COM_SMARTPTR_TYPEDEF(Interface,IID) typedef _COM_SMARTPTR< _COM_SMARTPTR_LEVEL2<Interface, &IID > > Interface ## Ptr
    195 #endif
    196 #else
    197 #define _COM_SMARTPTR_TYPEDEF(Interface,IID) typedef _COM_SMARTPTR<Interface,&IID > Interface ## Ptr
    198 #endif
    199 #endif
    200 #endif
    201 
    202 #if !defined(_COM_NO_STANDARD_GUIDS_)
    203 #if defined(__IFontDisp_INTERFACE_DEFINED__)
    204 #if !defined(Font)
    205   struct Font : IFontDisp {};
    206 #endif
    207 _COM_SMARTPTR_TYPEDEF(Font,__uuidof(IDispatch));
    208 
    209 #endif
    210 #if defined(__IFontEventsDisp_INTERFACE_DEFINED__)
    211 #if !defined(FontEvents)
    212   struct FontEvents : IFontEventsDisp {};
    213 #endif
    214 _COM_SMARTPTR_TYPEDEF(FontEvents,__uuidof(IDispatch));
    215 #endif
    216 #if defined(__IPictureDisp_INTERFACE_DEFINED__)
    217 #if !defined(Picture)
    218   struct Picture : IPictureDisp {};
    219 #endif
    220 _COM_SMARTPTR_TYPEDEF(Picture,__uuidof(IDispatch));
    221 #endif
    222 
    223 #include "comdefsp.h"
    224 #endif
    225 #endif
    226 
    227 #endif /* __cplusplus */
    228 
    229 #endif
    230