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#define WINAPI __stdcall 23#endif 24 25#ifdef __cplusplus 26 27class _com_error; 28void WINAPI _com_raise_error(HRESULT hr,IErrorInfo *perrinfo = 0); 29void WINAPI _set_com_error_handler(void (WINAPI *pHandler)(HRESULT hr,IErrorInfo *perrinfo)); 30void WINAPI _com_issue_error(HRESULT); 31void WINAPI _com_issue_errorex(HRESULT,IUnknown*,REFIID); 32HRESULT WINAPI _com_dispatch_propget(IDispatch*,DISPID,VARTYPE,void*); 33HRESULT __cdecl _com_dispatch_propput(IDispatch*,DISPID,VARTYPE,...); 34HRESULT __cdecl _com_dispatch_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...); 35HRESULT WINAPI _com_dispatch_raw_propget(IDispatch*,DISPID,VARTYPE,void*) throw(); 36HRESULT __cdecl _com_dispatch_raw_propput(IDispatch*,DISPID,VARTYPE,...) throw(); 37HRESULT __cdecl _com_dispatch_raw_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...) throw(); 38 39class _com_error { 40public: 41 _com_error(HRESULT hr,IErrorInfo *perrinfo = NULL,bool fAddRef = false) throw(); 42 _com_error(const _com_error &that) throw(); 43 virtual ~_com_error() throw(); 44 _com_error &operator=(const _com_error &that) throw(); 45 HRESULT Error() const throw(); 46 WORD WCode() const throw(); 47 IErrorInfo *ErrorInfo() const throw(); 48 _bstr_t Description() const; 49 DWORD HelpContext() const throw(); 50 _bstr_t HelpFile() const; 51 _bstr_t Source() const; 52 GUID GUID_() const throw(); 53 const TCHAR *ErrorMessage() const throw(); 54 static HRESULT WCodeToHRESULT(WORD wCode) throw(); 55 static WORD HRESULTToWCode(HRESULT hr) throw(); 56private: 57 void Dtor() throw(); 58 void Ctor(const _com_error &that) throw(); 59 enum { 60 WCODE_HRESULT_FIRST = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x200),WCODE_HRESULT_LAST = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF+1,0) - 1 61 }; 62 HRESULT m_hresult; 63 IErrorInfo *m_perrinfo; 64 mutable TCHAR *m_pszMsg; 65}; 66 67inline _com_error::_com_error(HRESULT hr,IErrorInfo *perrinfo,bool fAddRef) throw() : m_hresult(hr),m_perrinfo(perrinfo),m_pszMsg(NULL) { 68 if(m_perrinfo!=NULL && fAddRef) m_perrinfo->AddRef(); 69} 70 71inline _com_error::_com_error(const _com_error &that) throw() { 72 Ctor(that); 73} 74 75inline _com_error::~_com_error() throw() { 76 Dtor(); 77} 78 79inline _com_error &_com_error::operator=(const _com_error &that) throw() { 80 if(this!=&that) { 81 Dtor(); 82 Ctor(that); 83 } 84 return *this; 85} 86 87inline HRESULT _com_error::Error() const throw() { return m_hresult; } 88inline WORD _com_error::WCode() const throw() { return HRESULTToWCode(m_hresult); } 89 90inline IErrorInfo *_com_error::ErrorInfo() const throw() { 91 if(m_perrinfo!=NULL) m_perrinfo->AddRef(); 92 return m_perrinfo; 93} 94 95inline _bstr_t _com_error::Description() const { 96 BSTR bstr = NULL; 97 if(m_perrinfo!=NULL) m_perrinfo->GetDescription(&bstr); 98 return _bstr_t(bstr,false); 99} 100 101inline DWORD _com_error::HelpContext() const throw() { 102 DWORD dwHelpContext = 0; 103 if(m_perrinfo!=NULL) m_perrinfo->GetHelpContext(&dwHelpContext); 104 return dwHelpContext; 105} 106 107inline _bstr_t _com_error::HelpFile() const { 108 BSTR bstr = NULL; 109 if(m_perrinfo!=NULL) m_perrinfo->GetHelpFile(&bstr); 110 return _bstr_t(bstr,false); 111} 112 113inline _bstr_t _com_error::Source() const { 114 BSTR bstr = NULL; 115 if(m_perrinfo!=NULL) m_perrinfo->GetSource(&bstr); 116 return _bstr_t(bstr,false); 117} 118 119inline _GUID _com_error::GUID_() const throw() { 120 _GUID guid; 121 memset (&guid, 0, sizeof (_GUID)); 122 if(m_perrinfo!=NULL) m_perrinfo->GetGUID(&guid); 123 return guid; 124} 125 126inline const TCHAR *_com_error::ErrorMessage() const throw() { 127 if(!m_pszMsg) { 128 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,m_hresult,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&m_pszMsg,0,NULL); 129 if(m_pszMsg!=NULL) { 130 int nLen = lstrlen(m_pszMsg); 131 if(nLen > 1 && m_pszMsg[nLen - 1]=='\n') { 132 m_pszMsg[nLen-1] = 0; 133 if(m_pszMsg[nLen - 2]=='\r') m_pszMsg[nLen-2] = 0; 134 } 135 } else { 136 m_pszMsg = (LPTSTR)LocalAlloc(0,32 *sizeof(TCHAR)); 137 if(m_pszMsg!=NULL) { 138 WORD wCode = WCode(); 139 if(wCode!=0) { 140 _COM_PRINTF_S_1(m_pszMsg,32,TEXT("IDispatch error #%d"),wCode); 141 } else { 142 _COM_PRINTF_S_1(m_pszMsg,32,TEXT("Unknown error 0x%0lX"),m_hresult); 143 } 144 } 145 } 146 } 147 return m_pszMsg; 148} 149 150inline HRESULT _com_error::WCodeToHRESULT(WORD wCode) throw() { return wCode >= 0xFE00 ? WCODE_HRESULT_LAST : WCODE_HRESULT_FIRST + wCode; } 151inline WORD _com_error::HRESULTToWCode(HRESULT hr) throw() { return (hr >= WCODE_HRESULT_FIRST && hr <= WCODE_HRESULT_LAST) ? WORD(hr - WCODE_HRESULT_FIRST) : 0; } 152 153inline void _com_error::Dtor() throw() { 154 if(m_perrinfo!=NULL) m_perrinfo->Release(); 155 if(m_pszMsg!=NULL) LocalFree((HLOCAL)m_pszMsg); 156} 157 158inline void _com_error::Ctor(const _com_error &that) throw() { 159 m_hresult = that.m_hresult; 160 m_perrinfo = that.m_perrinfo; 161 m_pszMsg = NULL; 162 if(m_perrinfo!=NULL) m_perrinfo->AddRef(); 163} 164 165typedef int __missing_type__; 166 167#if !defined(_COM_SMARTPTR) 168#if !defined(_INC_COMIP) 169#include <comip.h> 170#endif 171#define _COM_SMARTPTR _com_ptr_t 172#define _COM_SMARTPTR_LEVEL2 _com_IIID 173#endif 174#if defined(_COM_SMARTPTR) 175#if !defined(_COM_SMARTPTR_TYPEDEF) 176#if defined(_COM_SMARTPTR_LEVEL2) 177#define _COM_SMARTPTR_TYPEDEF(Interface,IID) UUID IIDArgForTypedef ## Interface = IID; typedef _COM_SMARTPTR< _COM_SMARTPTR_LEVEL2<Interface, &IIDArgForTypedef ## Interface > > Interface ## Ptr 178#else 179#define _COM_SMARTPTR_TYPEDEF(Interface,IID) UUID IIDArgForTypedef ## Interface = IID; typedef _COM_SMARTPTR<Interface,&IIDArgForTypedef ## Interface > Interface ## Ptr 180#endif 181#endif 182#endif 183 184#if !defined(_COM_NO_STANDARD_GUIDS_) 185#if defined(__IFontDisp_INTERFACE_DEFINED__) 186#if !defined(Font) 187 struct Font : IFontDisp {}; 188#endif 189_COM_SMARTPTR_TYPEDEF(Font,__uuidof(IDispatch)); 190 191#endif 192#if defined(__IFontEventsDisp_INTERFACE_DEFINED__) 193#if !defined(FontEvents) 194 struct FontEvents : IFontEventsDisp {}; 195#endif 196_COM_SMARTPTR_TYPEDEF(FontEvents,__uuidof(IDispatch)); 197#endif 198#if defined(__IPictureDisp_INTERFACE_DEFINED__) 199#if !defined(Picture) 200 struct Picture : IPictureDisp {}; 201#endif 202_COM_SMARTPTR_TYPEDEF(Picture,__uuidof(IDispatch)); 203#endif 204 205#include "comdefsp.h" 206#endif 207#endif 208 209#endif /* __cplusplus */ 210 211#endif 212