WinStd
Additional templates and function helpers for Microsoft Windows using Standard C++ classes
COM.h
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 1991-2022 Amebis
4 Copyright © 2016 GÉANT
5*/
6
7#pragma once
8
9#include "Common.h"
10#include <unknwn.h>
11#include <string>
12
13namespace winstd
14{
17
23 class com_runtime_error : public num_runtime_error<HRESULT>
24 {
25 public:
32 com_runtime_error(_In_ error_type num, _In_ const std::string& msg) : num_runtime_error<HRESULT>(num, msg)
33 {
34 }
35
42 com_runtime_error(_In_ error_type num, _In_opt_z_ const char *msg = nullptr) : num_runtime_error<HRESULT>(num, msg)
43 {
44 }
45 };
46
48
54
59 {
64
70 template <class _T>
71 void operator()(_T *_Ptr) const
72 {
73 CoTaskMemFree(_Ptr);
74 }
75 };
76
82 template <class T>
83 class com_obj : public dplhandle<T*, NULL>
84 {
86
87 public:
93 template <class _Other>
94 com_obj(_In_ _Other *other)
95 {
96 assert(other);
97 other->QueryInterface(__uuidof(T), (void**)&m_h);
98 }
99
105 template <class _Other>
107 {
108 other->QueryInterface(__uuidof(T), (void**)&m_h);
109 }
110
114 virtual ~com_obj()
115 {
116 if (m_h != invalid)
118 }
119
125 template <class _Other>
126 HRESULT query_interface(_Out_ _Other **h) const
127 {
128 assert(h);
129 assert(m_h);
130 return m_h->QueryInterface(__uuidof(_Other), (void**)h);
131 }
132
138 template <class _Other>
139 HRESULT query_interface(_Out_ com_obj<_Other> &h) const
140 {
141 assert(m_h);
142 _Other *_h;
143 HRESULT hr = m_h->QueryInterface(__uuidof(_Other), (void**)&_h);
144 if (SUCCEEDED(hr))
145 h.attach(_h);
146 return hr;
147 }
148
149 protected:
155 void free_internal() noexcept override
156 {
157 m_h->Release();
158 }
159
169 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
170 {
171 h->AddRef();
172 return h;
173 }
174 };
175
179 class bstr : public dplhandle<BSTR, NULL>
180 {
182
183 public:
187 bstr(_In_ LPCOLESTR src) noexcept
188 {
189 m_h = SysAllocString(src);
190 }
191
195 bstr(_In_ LPCOLESTR src, _In_ UINT len) noexcept
196 {
197 m_h = SysAllocStringLen(src, len);
198 }
199
203 template<class _Traits, class _Ax>
204 bstr(_In_ const std::basic_string<wchar_t, _Traits, _Ax> &src) noexcept
205 {
206 m_h = SysAllocStringLen(src.c_str(), (UINT)src.length());
207 }
208
214 virtual ~bstr()
215 {
216 if (m_h != invalid)
218 }
219
225 UINT length() const noexcept
226 {
227 return SysStringLen(m_h);
228 }
229
230 protected:
236 void free_internal() noexcept override
237 {
238 SysFreeString(m_h);
239 }
240
250 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
251 {
252 return SysAllocStringLen(h, SysStringLen(h));
253 }
254 };
255
259 #pragma warning(push)
260 #pragma warning(disable: 26432) // Copy constructor and assignment operator are also present, but not detected by code analysis as they are using base type source object reference.
261 class variant : public VARIANT
262 {
263 public:
267 variant() noexcept
268 {
269 VariantInit(this);
270 }
271
275 variant(_In_ const VARIANT& varSrc)
276 {
277 vt = VT_EMPTY;
278 const HRESULT hr = VariantCopy(this, &varSrc);
279 if (FAILED(hr))
280 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
281 }
282
286 #pragma warning(suppress: 26495) // vt member is initialized as a result of memcpy()
287 variant(_Inout_ VARIANT&& varSrc) noexcept
288 {
289 memcpy(this, &varSrc, sizeof(VARIANT));
290 varSrc.vt = VT_EMPTY;
291 }
292
296 variant(_In_ bool bSrc) noexcept
297 {
298 vt = VT_BOOL;
299 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
300 }
301
305 variant(_In_ char cSrc) noexcept
306 {
307 vt = VT_I1;
308 cVal = cSrc;
309 }
310
314 variant(_In_ unsigned char nSrc) noexcept
315 {
316 vt = VT_UI1;
317 bVal = nSrc;
318 }
319
323 variant(_In_ short nSrc) noexcept
324 {
325 vt = VT_I2;
326 iVal = nSrc;
327 }
328
332 variant(_In_ unsigned short nSrc) noexcept
333 {
334 vt = VT_UI2;
335 uiVal = nSrc;
336 }
337
341 variant(_In_ int nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
342 {
343 assert(vtSrc == VT_I4 || vtSrc == VT_INT);
344 vt = vtSrc;
345 intVal = nSrc;
346 }
347
351 variant(_In_ unsigned int nSrc, _In_ VARTYPE vtSrc = VT_UI4) noexcept
352 {
353 assert(vtSrc == VT_UI4 || vtSrc == VT_UINT);
354 vt = vtSrc;
355 uintVal= nSrc;
356 }
357
361 variant(_In_ long nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
362 {
363 assert(vtSrc == VT_I4 || vtSrc == VT_ERROR);
364 vt = vtSrc;
365 lVal = nSrc;
366 }
367
371 variant(_In_ unsigned long nSrc) noexcept
372 {
373 vt = VT_UI4;
374 ulVal = nSrc;
375 }
376
380 variant(_In_ float fltSrc) noexcept
381 {
382 vt = VT_R4;
383 fltVal = fltSrc;
384 }
385
389 variant(_In_ double dblSrc, _In_ VARTYPE vtSrc = VT_R8) noexcept
390 {
391 assert(vtSrc == VT_R8 || vtSrc == VT_DATE);
392 vt = vtSrc;
393 dblVal = dblSrc;
394 }
395
399 variant(_In_ long long nSrc) noexcept
400 {
401 vt = VT_I8;
402 llVal = nSrc;
403 }
404
408 variant(_In_ unsigned long long nSrc) noexcept
409 {
410 vt = VT_UI8;
411 ullVal = nSrc;
412 }
413
417 variant(_In_ CY cySrc) noexcept
418 {
419 vt = VT_CY;
420 cyVal.Hi = cySrc.Hi;
421 cyVal.Lo = cySrc.Lo;
422 }
423
427 variant(_In_z_ LPCOLESTR lpszSrc) noexcept
428 {
429 vt = VT_EMPTY;
430 *this = lpszSrc;
431 }
432
436 variant(_In_z_ BSTR bstr) noexcept
437 {
438 vt = VT_EMPTY;
439 *this = bstr;
440 }
441
445 variant(_In_opt_ IDispatch* pSrc)
446 {
447 vt = VT_DISPATCH;
448 pdispVal = pSrc;
449
450 if (pdispVal != NULL)
451 pdispVal->AddRef();
452 }
453
457 variant(_In_opt_ IUnknown* pSrc)
458 {
459 vt = VT_UNKNOWN;
460 punkVal = pSrc;
461
462 if (punkVal != NULL)
463 punkVal->AddRef();
464 }
465
469 variant(_In_ const SAFEARRAY *pSrc)
470 {
471 assert(pSrc != NULL);
472
473 LPSAFEARRAY pCopy;
474 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
475 if (FAILED(hr))
476 throw winstd::com_runtime_error(hr, "SafeArrayCopy failed.");
477
478 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
479 vt |= VT_ARRAY;
480 parray = pCopy;
481 }
482
486 virtual ~variant()
487 {
488 VariantClear(this);
489 }
490
494 variant& operator=(_In_ const VARIANT& varSrc)
495 {
496 if (this != &varSrc) {
497 const HRESULT hr = VariantCopy(this, &varSrc);
498 if (FAILED(hr))
499 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
500 }
501 return *this;
502 }
503
507 variant& operator=(_Inout_ VARIANT&& varSrc) noexcept
508 {
509 if (this != &varSrc) {
510 VariantClear(this);
511 memcpy(this, &varSrc, sizeof(VARIANT));
512 varSrc.vt = VT_EMPTY;
513 }
514 return *this;
515 }
516
520 variant& operator=(_In_ bool bSrc) noexcept
521 {
522 if (vt != VT_BOOL) {
523 VariantClear(this);
524 vt = VT_BOOL;
525 }
526 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
527 return *this;
528 }
529
533 variant& operator=(_In_ char cSrc) noexcept
534 {
535 if (vt != VT_I1) {
536 VariantClear(this);
537 vt = VT_I1;
538 }
539 cVal = cSrc;
540 return *this;
541 }
542
546 variant& operator=(_In_ unsigned char nSrc) noexcept
547 {
548 if (vt != VT_UI1) {
549 VariantClear(this);
550 vt = VT_UI1;
551 }
552 bVal = nSrc;
553 return *this;
554 }
555
559 variant& operator=(_In_ short nSrc) noexcept
560 {
561 if (vt != VT_I2) {
562 VariantClear(this);
563 vt = VT_I2;
564 }
565 iVal = nSrc;
566 return *this;
567 }
568
572 variant& operator=(_In_ unsigned short nSrc) noexcept
573 {
574 if (vt != VT_UI2) {
575 VariantClear(this);
576 vt = VT_UI2;
577 }
578 uiVal = nSrc;
579 return *this;
580 }
581
585 variant& operator=(_In_ int nSrc) noexcept
586 {
587 if (vt != VT_I4) {
588 VariantClear(this);
589 vt = VT_I4;
590 }
591 intVal = nSrc;
592 return *this;
593 }
594
598 variant& operator=(_In_ unsigned int nSrc) noexcept
599 {
600 if (vt != VT_UI4) {
601 VariantClear(this);
602 vt = VT_UI4;
603 }
604 uintVal= nSrc;
605 return *this;
606 }
607
611 variant& operator=(_In_ long nSrc) noexcept
612 {
613 if (vt != VT_I4) {
614 VariantClear(this);
615 vt = VT_I4;
616 }
617 lVal = nSrc;
618 return *this;
619 }
620
624 variant& operator=(_In_ unsigned long nSrc) noexcept
625 {
626 if (vt != VT_UI4) {
627 VariantClear(this);
628 vt = VT_UI4;
629 }
630 ulVal = nSrc;
631 return *this;
632 }
633
637 variant& operator=(_In_ long long nSrc) noexcept
638 {
639 if (vt != VT_I8) {
640 VariantClear(this);
641 vt = VT_I8;
642 }
643 llVal = nSrc;
644 return *this;
645 }
646
650 variant& operator=(_In_ unsigned long long nSrc) noexcept
651 {
652 if (vt != VT_UI8) {
653 VariantClear(this);
654 vt = VT_UI8;
655 }
656 ullVal = nSrc;
657
658 return *this;
659 }
660
664 variant& operator=(_In_ float fltSrc) noexcept
665 {
666 if (vt != VT_R4) {
667 VariantClear(this);
668 vt = VT_R4;
669 }
670 fltVal = fltSrc;
671 return *this;
672 }
673
677 variant& operator=(_In_ double dblSrc) noexcept
678 {
679 if (vt != VT_R8) {
680 VariantClear(this);
681 vt = VT_R8;
682 }
683 dblVal = dblSrc;
684 return *this;
685 }
686
690 variant& operator=(_In_ CY cySrc) noexcept
691 {
692 if (vt != VT_CY) {
693 VariantClear(this);
694 vt = VT_CY;
695 }
696 cyVal.Hi = cySrc.Hi;
697 cyVal.Lo = cySrc.Lo;
698 return *this;
699 }
700
704 variant& operator=(_In_z_ LPCOLESTR lpszSrc) noexcept
705 {
706 VariantClear(this);
707 vt = VT_BSTR;
708 bstrVal = SysAllocString(lpszSrc);
709 return *this;
710 }
711
715 variant& operator=(_Inout_opt_ IDispatch* pSrc)
716 {
717 VariantClear(this);
718 vt = VT_DISPATCH;
719 pdispVal = pSrc;
720 if (pdispVal != NULL)
721 pdispVal->AddRef();
722 return *this;
723 }
724
728 variant& operator=(_Inout_opt_ IUnknown* pSrc)
729 {
730 VariantClear(this);
731 vt = VT_UNKNOWN;
732 punkVal = pSrc;
733 if (punkVal != NULL)
734 punkVal->AddRef();
735 return *this;
736 }
737
741 variant& operator=(_In_ unsigned char* pbSrc) noexcept
742 {
743 if (vt != (VT_UI1|VT_BYREF)) {
744 VariantClear(this);
745 vt = VT_UI1|VT_BYREF;
746 }
747 pbVal = pbSrc;
748 return *this;
749 }
750
754 variant& operator=(_In_ short* pnSrc) noexcept
755 {
756 if (vt != (VT_I2|VT_BYREF)) {
757 VariantClear(this);
758 vt = VT_I2|VT_BYREF;
759 }
760 piVal = pnSrc;
761 return *this;
762 }
763
767 variant& operator=(_In_ unsigned short* pnSrc) noexcept
768 {
769 if (vt != (VT_UI2|VT_BYREF)) {
770 VariantClear(this);
771 vt = VT_UI2|VT_BYREF;
772 }
773 puiVal = pnSrc;
774 return *this;
775 }
776
780 variant& operator=(_In_ int* pnSrc) noexcept
781 {
782 if (vt != (VT_I4|VT_BYREF)) {
783 VariantClear(this);
784 vt = VT_I4|VT_BYREF;
785 }
786 pintVal = pnSrc;
787 return *this;
788 }
789
793 variant& operator=(_In_ unsigned int* pnSrc) noexcept
794 {
795 if (vt != (VT_UI4|VT_BYREF)) {
796 VariantClear(this);
797 vt = VT_UI4|VT_BYREF;
798 }
799 puintVal = pnSrc;
800 return *this;
801 }
802
806 variant& operator=(_In_ long* pnSrc) noexcept
807 {
808 if (vt != (VT_I4|VT_BYREF)) {
809 VariantClear(this);
810 vt = VT_I4|VT_BYREF;
811 }
812 plVal = pnSrc;
813 return *this;
814 }
815
819 variant& operator=(_In_ unsigned long* pnSrc) noexcept
820 {
821 if (vt != (VT_UI4|VT_BYREF)) {
822 VariantClear(this);
823 vt = VT_UI4|VT_BYREF;
824 }
825 pulVal = pnSrc;
826 return *this;
827 }
828
832 variant& operator=(_In_ long long* pnSrc) noexcept
833 {
834 if (vt != (VT_I8|VT_BYREF)) {
835 VariantClear(this);
836 vt = VT_I8|VT_BYREF;
837 }
838 pllVal = pnSrc;
839 return *this;
840 }
841
845 variant& operator=(_In_ unsigned long long* pnSrc) noexcept
846 {
847 if (vt != (VT_UI8|VT_BYREF)) {
848 VariantClear(this);
849 vt = VT_UI8|VT_BYREF;
850 }
851 pullVal = pnSrc;
852 return *this;
853 }
854
858 variant& operator=(_In_ float* pfSrc) noexcept
859 {
860 if (vt != (VT_R4|VT_BYREF)) {
861 VariantClear(this);
862 vt = VT_R4|VT_BYREF;
863 }
864 pfltVal = pfSrc;
865 return *this;
866 }
867
871 variant& operator=(_In_ double* pfSrc) noexcept
872 {
873 if (vt != (VT_R8|VT_BYREF)) {
874 VariantClear(this);
875 vt = VT_R8|VT_BYREF;
876 }
877 pdblVal = pfSrc;
878 return *this;
879 }
880
884 variant& operator=(_In_ const SAFEARRAY *pSrc) noexcept
885 {
886 assert(pSrc != NULL);
887 VariantClear(this);
888
889 LPSAFEARRAY pCopy;
890 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
891 if (SUCCEEDED(hr)) {
892 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
893 vt |= VT_ARRAY;
894 parray = pCopy;
895 } else
896 assert(0);
897
898 return *this;
899 }
900
901 public:
910 bool operator==(_In_ const VARIANT& varSrc) const noexcept
911 {
912 if (vt == VT_NULL && varSrc.vt == VT_NULL) return true;
913 if (vt != varSrc.vt) return false;
914 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0) == static_cast<HRESULT>(VARCMP_EQ);
915 }
916
925 bool operator!=(_In_ const VARIANT& varSrc) const noexcept
926 {
927 return !operator==(varSrc);
928 }
929
938 bool operator<(_In_ const VARIANT& varSrc) const noexcept
939 {
940 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
941 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_LT);
942 }
943
952 bool operator>(_In_ const VARIANT& varSrc) const noexcept
953 {
954 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
955 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_GT);
956 }
957
966 bool operator<=(_In_ const VARIANT& varSrc) const noexcept
967 {
968 return !operator>(varSrc);
969 }
970
979 bool operator>=(_In_ const VARIANT& varSrc) const noexcept
980 {
981 return !operator<(varSrc);
982 }
983
989 HRESULT change_type(_In_ VARTYPE _vt, _In_opt_ USHORT wFlags = 0) noexcept
990 {
991 return VariantChangeType(this, this, wFlags, _vt);
992 }
993
994 private:
996 HRESULT compare(_In_ const VARIANT &varLeft, _In_ const VARIANT &varRight, _In_ LCID lcid, _In_ ULONG dwFlags) const noexcept
997 {
998 switch(vt) {
999 case VT_I1: return varLeft.cVal == varRight.cVal ? VARCMP_EQ : varLeft.cVal > varRight.cVal ? VARCMP_GT : VARCMP_LT;
1000 case VT_UI2: return varLeft.uiVal == varRight.uiVal ? VARCMP_EQ : varLeft.uiVal > varRight.uiVal ? VARCMP_GT : VARCMP_LT;
1001 case VT_UI4: return varLeft.uintVal == varRight.uintVal ? VARCMP_EQ : varLeft.uintVal > varRight.uintVal ? VARCMP_GT : VARCMP_LT;
1002 case VT_UI8: return varLeft.ullVal == varRight.ullVal ? VARCMP_EQ : varLeft.ullVal > varRight.ullVal ? VARCMP_GT : VARCMP_LT;
1003 default: return VarCmp(const_cast<LPVARIANT>(&varLeft), const_cast<LPVARIANT>(&varRight), lcid, dwFlags);
1004 }
1005 }
1007 };
1008 #pragma warning(pop)
1009
1014 {
1017
1018 public:
1024 com_initializer(_In_opt_ LPVOID pvReserved) noexcept
1025 {
1026 m_result = CoInitialize(pvReserved);
1027 }
1028
1034 com_initializer(_In_opt_ LPVOID pvReserved, _In_ DWORD dwCoInit) noexcept
1035 {
1036 m_result = CoInitializeEx(pvReserved, dwCoInit);
1037 }
1038
1045 {
1046 if (SUCCEEDED(m_result))
1047 CoUninitialize();
1048 }
1049
1055 HRESULT status() const noexcept
1056 {
1057 return m_result;
1058 }
1059
1060 protected:
1061 HRESULT m_result;
1062 };
1063
1065}
1066
1069
1075template <class T>
1076static _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter, _In_ DWORD dwClsContext, _Inout_ winstd::com_obj<T> &v)
1077{
1078 T* ppv;
1079 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&ppv);
1080 if (SUCCEEDED(hr))
1081 v.attach(ppv);
1082 return hr;
1083}
1084
BSTR string wrapper.
Definition: COM.h:180
bstr(LPCOLESTR src) noexcept
Constructs BSTR from OLE string.
Definition: COM.h:187
virtual ~bstr()
Destroys the string.
Definition: COM.h:214
handle_type duplicate_internal(handle_type h) const noexcept override
Duplicates the string.
Definition: COM.h:250
bstr(const std::basic_string< wchar_t, _Traits, _Ax > &src) noexcept
Constructs BSTR from std::basic_string.
Definition: COM.h:204
bstr(LPCOLESTR src, UINT len) noexcept
Constructs BSTR from OLE string with length.
Definition: COM.h:195
void free_internal() noexcept override
Destroys the string.
Definition: COM.h:236
UINT length() const noexcept
Returns the length of the string.
Definition: COM.h:225
Context scope automatic COM (un)initialization.
Definition: COM.h:1014
com_initializer(LPVOID pvReserved, DWORD dwCoInit) noexcept
Initializes the COM library for use by the calling thread, sets the thread's concurrency model,...
Definition: COM.h:1034
com_initializer(LPVOID pvReserved) noexcept
Initializes the COM library on the current thread and identifies the concurrency model as single-thre...
Definition: COM.h:1024
HRESULT status() const noexcept
Return result of CoInitialize() call.
Definition: COM.h:1055
virtual ~com_initializer()
Uninitializes COM.
Definition: COM.h:1044
HRESULT m_result
Result of CoInitialize call.
Definition: COM.h:1061
COM object wrapper template.
Definition: COM.h:84
void free_internal() noexcept override
Releases the object by decrementing reference counter.
Definition: COM.h:155
handle_type duplicate_internal(handle_type h) const noexcept override
Duplicates the object by incrementing the reference counter.
Definition: COM.h:169
HRESULT query_interface(_Other **h) const
Queries the object for another interface.
Definition: COM.h:126
HRESULT query_interface(com_obj< _Other > &h) const
Queries the object for another interface.
Definition: COM.h:139
virtual ~com_obj()
Releases object.
Definition: COM.h:114
com_obj(_Other *other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:94
com_obj(com_obj< _Other > &other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:106
COM runtime error.
Definition: COM.h:24
com_runtime_error(error_type num, const std::string &msg)
Constructs an exception.
Definition: COM.h:32
com_runtime_error(error_type num, const char *msg=nullptr)
Constructs an exception.
Definition: COM.h:42
Base abstract template class to support object handle keeping for objects that support trivial handle...
Definition: Common.h:865
T * handle_type
Datatype of the object handle this template class handles.
Definition: Common.h:608
handle_type m_h
Object handle.
Definition: Common.h:854
Numerical runtime error.
Definition: Common.h:1002
HRESULT error_type
Error number type.
Definition: Common.h:1004
VARIANT struct wrapper.
Definition: COM.h:262
bool operator<=(const VARIANT &varSrc) const noexcept
Is variant less than or equal to?
Definition: COM.h:966
variant(bool bSrc) noexcept
Constructs VARIANT from bool.
Definition: COM.h:296
variant & operator=(unsigned int nSrc) noexcept
Copy from unsigned int value.
Definition: COM.h:598
variant & operator=(unsigned long nSrc) noexcept
Copy from unsigned long value.
Definition: COM.h:624
variant(float fltSrc) noexcept
Constructs VARIANT from float.
Definition: COM.h:380
variant(VARIANT &&varSrc) noexcept
Moves VARIANT from another.
Definition: COM.h:287
variant & operator=(float fltSrc) noexcept
Copy from float value.
Definition: COM.h:664
variant & operator=(float *pfSrc) noexcept
Copy from float reference.
Definition: COM.h:858
variant(IDispatch *pSrc)
Constructs VARIANT from IDispatch.
Definition: COM.h:445
variant(int nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from integer.
Definition: COM.h:341
variant(const SAFEARRAY *pSrc)
Constructs VARIANT from SAFEARRAY.
Definition: COM.h:469
variant & operator=(double *pfSrc) noexcept
Copy from double reference.
Definition: COM.h:871
variant & operator=(int *pnSrc) noexcept
Copy from int reference.
Definition: COM.h:780
bool operator>(const VARIANT &varSrc) const noexcept
Is variant greater than?
Definition: COM.h:952
variant & operator=(bool bSrc) noexcept
Copy from bool value.
Definition: COM.h:520
variant & operator=(long nSrc) noexcept
Copy from long value.
Definition: COM.h:611
variant & operator=(const SAFEARRAY *pSrc) noexcept
Copy from SAFEARRAY.
Definition: COM.h:884
HRESULT change_type(VARTYPE _vt, USHORT wFlags=0) noexcept
Converts a variant from one type to another.
Definition: COM.h:989
variant & operator=(IUnknown *pSrc)
Copy from IUnknown.
Definition: COM.h:728
variant & operator=(short nSrc) noexcept
Copy from short value.
Definition: COM.h:559
variant & operator=(unsigned char *pbSrc) noexcept
Copy from unsigned char reference.
Definition: COM.h:741
variant & operator=(unsigned short nSrc) noexcept
Copy from unsigned short value.
Definition: COM.h:572
variant & operator=(unsigned char nSrc) noexcept
Copy from unsigned char value.
Definition: COM.h:546
variant & operator=(char cSrc) noexcept
Copy from char value.
Definition: COM.h:533
variant(LPCOLESTR lpszSrc) noexcept
Constructs VARIANT from OLE string.
Definition: COM.h:427
virtual ~variant()
Destroys VARIANT.
Definition: COM.h:486
variant(const VARIANT &varSrc)
Constructs VARIANT from another.
Definition: COM.h:275
variant(unsigned char nSrc) noexcept
Constructs VARIANT from byte.
Definition: COM.h:314
variant & operator=(double dblSrc) noexcept
Copy from double value.
Definition: COM.h:677
bool operator!=(const VARIANT &varSrc) const noexcept
Is variant not equal to?
Definition: COM.h:925
variant & operator=(int nSrc) noexcept
Copy from int value.
Definition: COM.h:585
variant(unsigned long nSrc) noexcept
Constructs VARIANT from unsigned long.
Definition: COM.h:371
bool operator==(const VARIANT &varSrc) const noexcept
Is variant equal to?
Definition: COM.h:910
variant(IUnknown *pSrc)
Constructs VARIANT from IUnknown.
Definition: COM.h:457
variant(unsigned int nSrc, VARTYPE vtSrc=VT_UI4) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:351
variant & operator=(CY cySrc) noexcept
Copy from CY value.
Definition: COM.h:690
variant & operator=(LPCOLESTR lpszSrc) noexcept
Copy from OLE string value.
Definition: COM.h:704
variant(long long nSrc) noexcept
Constructs VARIANT from 64-bit integer.
Definition: COM.h:399
variant & operator=(unsigned int *pnSrc) noexcept
Copy from unsigned int reference.
Definition: COM.h:793
variant(long nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from long.
Definition: COM.h:361
variant & operator=(long *pnSrc) noexcept
Copy from long reference.
Definition: COM.h:806
variant(unsigned short nSrc) noexcept
Constructs VARIANT from unsigned short.
Definition: COM.h:332
bool operator>=(const VARIANT &varSrc) const noexcept
Is variant greater than or equal to?
Definition: COM.h:979
variant & operator=(short *pnSrc) noexcept
Copy from short reference.
Definition: COM.h:754
variant() noexcept
Constructs blank VARIANT.
Definition: COM.h:267
bool operator<(const VARIANT &varSrc) const noexcept
Is variant less than?
Definition: COM.h:938
variant(unsigned long long nSrc) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:408
variant(char cSrc) noexcept
Constructs VARIANT from character.
Definition: COM.h:305
variant & operator=(unsigned short *pnSrc) noexcept
Copy from unsigned short reference.
Definition: COM.h:767
variant & operator=(long long *pnSrc) noexcept
Copy from long long reference.
Definition: COM.h:832
variant(BSTR bstr) noexcept
Constructs VARIANT from BSTR.
Definition: COM.h:436
variant & operator=(unsigned long long *pnSrc) noexcept
Copy from unsigned long long reference.
Definition: COM.h:845
variant(double dblSrc, VARTYPE vtSrc=VT_R8) noexcept
Constructs VARIANT from double or variant date.
Definition: COM.h:389
variant(short nSrc) noexcept
Constructs VARIANT from short.
Definition: COM.h:323
variant(CY cySrc) noexcept
Constructs VARIANT from CY (64-bit integer)
Definition: COM.h:417
variant & operator=(unsigned long long nSrc) noexcept
Copy from unsigned long long value.
Definition: COM.h:650
variant & operator=(VARIANT &&varSrc) noexcept
Moves from another VARIANT.
Definition: COM.h:507
variant & operator=(long long nSrc) noexcept
Copy from long long value.
Definition: COM.h:637
variant & operator=(IDispatch *pSrc)
Copy from IDispatch.
Definition: COM.h:715
variant & operator=(unsigned long *pnSrc) noexcept
Copy from unsigned long reference.
Definition: COM.h:819
variant & operator=(const VARIANT &varSrc)
Copy from another VARIANT.
Definition: COM.h:494
#define WINSTD_NONCOPYABLE(C)
Declares a class as non-copyable.
Definition: Common.h:52
#define WINSTD_NONMOVABLE(C)
Declares a class as non-movable.
Definition: Common.h:60
#define WINSTD_DPLHANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition: Common.h:173
static const T * invalid
Invalid handle value.
Definition: Common.h:613
Deleter for unique_ptr using CoTaskMemFree.
Definition: COM.h:59
void operator()(_T *_Ptr) const
Delete a pointer.
Definition: COM.h:71
CoTaskMemFree_delete() noexcept
Default constructor.
Definition: COM.h:63