4 * Copyright 2009 Andrew Hill <ash77@reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 // It is common to use this in ATL constructors. They only store this for later use, so the usage is safe.
28 #pragma warning(disable:4355)
32 #define _ATL_PACKING 8
35 #ifndef _ATL_FREE_THREADED
36 #ifndef _ATL_APARTMENT_THREADED
37 #ifndef _ATL_SINGLE_THREADED
38 #define _ATL_FREE_THREADED
47 #ifdef _ATL_DISABLE_NO_VTABLE
50 #define ATL_NO_VTABLE __declspec(novtable)
56 inline HRESULT
AtlHresultFromLastError() noexcept
58 DWORD dwError
= ::GetLastError();
59 return HRESULT_FROM_WIN32(dwError
);
63 class _NoAddRefReleaseOnCComPtr
: public T
66 virtual ULONG STDMETHODCALLTYPE
AddRef() = 0;
67 virtual ULONG STDMETHODCALLTYPE
Release() = 0;
88 CComPtr(const CComPtr
<T
> &lp
)
101 HRESULT
CoCreateInstance(REFCLSID rclsid
, REFIID riid
, LPUNKNOWN pOuter
= NULL
, DWORD ClsCtx
= CLSCTX_ALL
)
104 return ::CoCreateInstance(rclsid
, pOuter
, ClsCtx
, riid
, (void**)&p
);
107 HRESULT
CoCreateInstance(LPCOLESTR ProgID
, REFIID riid
, LPUNKNOWN pOuter
= NULL
, DWORD ClsCtx
= CLSCTX_ALL
)
110 HRESULT hr
= CLSIDFromProgID(ProgID
, &clsid
);
111 return FAILED(hr
) ? hr
: CoCreateInstance(clsid
, riid
, pOuter
, ClsCtx
);
114 T
*operator = (T
*lp
)
128 T
*operator = (const CComPtr
<T
> &lp
)
142 // We cannot enable this until gcc starts supporting __uuidof
145 template <typename Q
>
146 T
* operator=(const CComPtr
<Q
>& lp
)
150 if (!lp
.p
|| FAILED(lp
.p
->QueryInterface(__uuidof(T
), (void**)(IUnknown
**)&p
)))
159 HRESULT
CoCreateInstance(REFCLSID rclsid
, LPUNKNOWN pOuter
= NULL
, DWORD ClsCtx
= CLSCTX_ALL
)
161 return CoCreateInstance(rclsid
, __uuidof(T
), pOuter
, ClsCtx
);
164 HRESULT
CoCreateInstance(LPCOLESTR ProgID
, LPUNKNOWN pOuter
= NULL
, DWORD ClsCtx
= CLSCTX_ALL
)
166 return CoCreateInstance(ProgID
, __uuidof(T
), pOuter
, ClsCtx
);
197 ATLASSERT(p
== NULL
);
206 _NoAddRefReleaseOnCComPtr
<T
> *operator -> () const
208 ATLASSERT(p
!= NULL
);
209 return (_NoAddRefReleaseOnCComPtr
<T
> *)p
;
214 //CComQIIDPtr<I_ID(Itype)> is the gcc compatible version of CComQIPtr<Itype>
215 #define I_ID(Itype) Itype,&IID_##Itype
217 template <class T
, const IID
* piid
>
222 // Let's tell GCC how to find a symbol.
228 CComQIIDPtr(_Inout_opt_ T
* lp
) :
232 CComQIIDPtr(_Inout_
const CComQIIDPtr
<T
,piid
>& lp
):
236 CComQIIDPtr(_Inout_opt_ IUnknown
* lp
)
240 if (FAILED(lp
->QueryInterface(*piid
, (void**)(IUnknown
**)&p
)))
244 T
*operator = (T
*lp
)
258 T
*operator = (const CComQIIDPtr
<T
,piid
> &lp
)
272 T
* operator=(IUnknown
* lp
)
276 if (!lp
|| FAILED(lp
->QueryInterface(*piid
, (void**)(IUnknown
**)&p
)))
297 CComBSTR(LPCOLESTR pSrc
)
302 m_str
= ::SysAllocString(pSrc
);
310 m_str
= ::SysAllocStringLen(NULL
, length
);
313 CComBSTR(int length
, LPCOLESTR pSrc
)
318 m_str
= ::SysAllocStringLen(pSrc
, length
);
325 int len
= MultiByteToWideChar(CP_THREAD_ACP
, 0, pSrc
, -1, NULL
, 0);
326 m_str
= ::SysAllocStringLen(NULL
, len
- 1);
329 int res
= MultiByteToWideChar(CP_THREAD_ACP
, 0, pSrc
, -1, m_str
, len
);
330 ATLASSERT(res
== len
);
333 ::SysFreeString(m_str
);
344 CComBSTR(const CComBSTR
&other
)
346 m_str
= other
.Copy();
349 CComBSTR(REFGUID guid
)
352 ::StringFromGUID2(guid
, szGuid
, 40);
353 m_str
= ::SysAllocString(szGuid
);
358 ::SysFreeString(m_str
);
362 operator BSTR () const
372 CComBSTR
&operator = (const CComBSTR
&other
)
374 ::SysFreeString(m_str
);
375 m_str
= other
.Copy();
379 void Attach(BSTR bstr
)
381 ::SysFreeString(m_str
);
396 return ::SysAllocStringLen(m_str
, ::SysStringLen(m_str
));
399 HRESULT
CopyTo(BSTR
*other
) const
407 bool LoadString(HMODULE module
, DWORD uID
)
409 ::SysFreeString(m_str
);
411 const wchar_t *ptr
= NULL
;
412 int len
= ::LoadStringW(module
, uID
, (PWSTR
)&ptr
, 0);
414 m_str
= ::SysAllocStringLen(ptr
, len
);
415 return m_str
!= NULL
;
418 unsigned int Length() const
420 return ::SysStringLen(m_str
);
423 unsigned int ByteLength() const
425 return ::SysStringByteLen(m_str
);
430 class CComVariant
: public tagVARIANT
438 CComVariant(const CComVariant
& other
)
440 V_VT(this) = VT_EMPTY
;
449 CComVariant(LPCOLESTR lpStr
)
451 V_VT(this) = VT_BSTR
;
452 V_BSTR(this) = ::SysAllocString(lpStr
);
455 CComVariant(LPCSTR lpStr
)
457 V_VT(this) = VT_BSTR
;
459 V_BSTR(this) = str
.Detach();
462 CComVariant(bool value
)
464 V_VT(this) = VT_BOOL
;
465 V_BOOL(this) = value
? VARIANT_TRUE
: VARIANT_FALSE
;
468 CComVariant(char value
)
474 CComVariant(BYTE value
)
480 CComVariant(short value
)
486 CComVariant(unsigned short value
)
492 CComVariant(int value
, VARENUM type
= VT_I4
)
494 if (type
== VT_I4
|| type
== VT_INT
)
501 V_VT(this) = VT_ERROR
;
502 V_ERROR(this) = E_INVALIDARG
;
506 CComVariant(unsigned int value
, VARENUM type
= VT_UI4
)
508 if (type
== VT_UI4
|| type
== VT_UINT
)
515 V_VT(this) = VT_ERROR
;
516 V_ERROR(this) = E_INVALIDARG
;
520 CComVariant(long value
, VARENUM type
= VT_I4
)
522 if (type
== VT_I4
|| type
== VT_ERROR
)
529 V_VT(this) = VT_ERROR
;
530 V_ERROR(this) = E_INVALIDARG
;
534 CComVariant(unsigned long value
)
540 CComVariant(float value
)
546 CComVariant(double value
, VARENUM type
= VT_R8
)
548 if (type
== VT_R8
|| type
== VT_DATE
)
555 V_VT(this) = VT_ERROR
;
556 V_ERROR(this) = E_INVALIDARG
;
560 CComVariant(const LONGLONG
& value
)
566 CComVariant(const ULONGLONG
& value
)
572 CComVariant(const CY
& value
)
575 V_I8(this) = value
.int64
;
581 return ::VariantClear(this);
584 HRESULT
Copy(_In_
const VARIANT
* src
)
586 return ::VariantCopy(this, const_cast<VARIANT
*>(src
));
589 HRESULT
ChangeType(_In_ VARTYPE newType
, _In_opt_
const LPVARIANT src
= NULL
)
591 const LPVARIANT lpSrc
= src
? src
: this;
592 return ::VariantChangeType(this, lpSrc
, 0, newType
);
600 #ifndef _ATL_NO_AUTOMATIC_NAMESPACE
602 #endif //!_ATL_NO_AUTOMATIC_NAMESPACE