xref: /reactos/sdk/include/vcruntime/comdef.h (revision d326ca1f)
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 
27 class _com_error;
28 void WINAPI _com_raise_error(HRESULT hr,IErrorInfo *perrinfo = 0);
29 void WINAPI _set_com_error_handler(void (WINAPI *pHandler)(HRESULT hr,IErrorInfo *perrinfo));
30 void WINAPI _com_issue_error(HRESULT);
31 void WINAPI _com_issue_errorex(HRESULT,IUnknown*,REFIID);
32 HRESULT WINAPI _com_dispatch_propget(IDispatch*,DISPID,VARTYPE,void*);
33 HRESULT __cdecl _com_dispatch_propput(IDispatch*,DISPID,VARTYPE,...);
34 HRESULT __cdecl _com_dispatch_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...);
35 HRESULT WINAPI _com_dispatch_raw_propget(IDispatch*,DISPID,VARTYPE,void*) throw();
36 HRESULT __cdecl _com_dispatch_raw_propput(IDispatch*,DISPID,VARTYPE,...) throw();
37 HRESULT __cdecl _com_dispatch_raw_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...) throw();
38 
39 class _com_error {
40 public:
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();
56 private:
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 
67 inline _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 
71 inline _com_error::_com_error(const _com_error &that) throw() {
72   Ctor(that);
73 }
74 
75 inline _com_error::~_com_error() throw() {
76   Dtor();
77 }
78 
79 inline _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 
87 inline HRESULT _com_error::Error() const throw() { return m_hresult; }
88 inline WORD _com_error::WCode() const throw() { return HRESULTToWCode(m_hresult); }
89 
90 inline IErrorInfo *_com_error::ErrorInfo() const throw() {
91   if(m_perrinfo!=NULL) m_perrinfo->AddRef();
92   return m_perrinfo;
93 }
94 
95 inline _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 
101 inline DWORD _com_error::HelpContext() const throw() {
102   DWORD dwHelpContext = 0;
103   if(m_perrinfo!=NULL) m_perrinfo->GetHelpContext(&dwHelpContext);
104   return dwHelpContext;
105 }
106 
107 inline _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 
113 inline _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 
119 inline _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 
126 inline 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 
150 inline HRESULT _com_error::WCodeToHRESULT(WORD wCode) throw() { return wCode >= 0xFE00 ? WCODE_HRESULT_LAST : WCODE_HRESULT_FIRST + wCode; }
151 inline WORD _com_error::HRESULTToWCode(HRESULT hr) throw() { return (hr >= WCODE_HRESULT_FIRST && hr <= WCODE_HRESULT_LAST) ? WORD(hr - WCODE_HRESULT_FIRST) : 0; }
152 
153 inline void _com_error::Dtor() throw() {
154   if(m_perrinfo!=NULL) m_perrinfo->Release();
155   if(m_pszMsg!=NULL) LocalFree((HLOCAL)m_pszMsg);
156 }
157 
158 inline 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 
165 typedef 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, IID_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, IID_IDispatch);
197 #endif
198 #if defined(__IPictureDisp_INTERFACE_DEFINED__)
199 #if !defined(Picture)
200   struct Picture : IPictureDisp {};
201 #endif
202 _COM_SMARTPTR_TYPEDEF(Picture, IID_IDispatch);
203 #endif
204 
205 #include "comdefsp.h"
206 #endif
207 #endif
208 
209 #endif /* __cplusplus */
210 
211 #endif
212