[CLASSPNP] Fix MSVC build. Brought to you by Timo.
[reactos.git] / reactos / sdk / include / crt / comdef.h
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