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
80 template <class T>
81 class com_obj : public dplhandle<T*, NULL>
82 {
84
85 public:
91 __declspec(deprecated("Use CoCreateInstance"))
92 com_obj(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
93 {
94 CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&m_h);
95 }
96
102 template <class _Other>
103 com_obj(_In_ _Other *other)
104 {
105 assert(other);
106 other->QueryInterface(__uuidof(T), (void**)&m_h);
107 }
108
114 template <class _Other>
115 com_obj(_In_ com_obj<_Other> &other)
116 {
117 other->QueryInterface(__uuidof(T), (void**)&m_h);
118 }
119
123 virtual ~com_obj()
124 {
125 if (m_h != invalid)
127 }
128
134 __declspec(deprecated("Use CoCreateInstance"))
135 HRESULT create(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter = NULL, _In_ DWORD dwClsContext = CLSCTX_ALL)
136 {
137 handle_type h;
138 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&h);
139 if (SUCCEEDED(hr))
140 attach(h);
141 return hr;
142 }
143
149 template <class _Other>
150 HRESULT query_interface(_Out_ _Other **h) const
151 {
152 assert(h);
153 assert(m_h);
154 return m_h->QueryInterface(__uuidof(_Other), (void**)h);
155 }
156
162 template <class _Other>
163 HRESULT query_interface(_Out_ com_obj<_Other> &h) const
164 {
165 assert(m_h);
166 _Other *_h;
167 HRESULT hr = m_h->QueryInterface(__uuidof(_Other), (void**)&_h);
168 if (SUCCEEDED(hr))
169 h.attach(_h);
170 return hr;
171 }
172
173 protected:
179 void free_internal() noexcept override
180 {
181 m_h->Release();
182 }
183
193 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
194 {
195 h->AddRef();
196 return h;
197 }
198 };
199
203 class bstr : public dplhandle<BSTR, NULL>
204 {
206
207 public:
211 bstr(_In_ LPCOLESTR src) noexcept
212 {
213 m_h = SysAllocString(src);
214 }
215
219 bstr(_In_ LPCOLESTR src, _In_ UINT len) noexcept
220 {
221 m_h = SysAllocStringLen(src, len);
222 }
223
227 template<class _Traits, class _Ax>
228 bstr(_In_ const std::basic_string<wchar_t, _Traits, _Ax> &src) noexcept
229 {
230 m_h = SysAllocStringLen(src.c_str(), (UINT)src.length());
231 }
232
238 virtual ~bstr()
239 {
240 if (m_h != invalid)
242 }
243
249 UINT length() const noexcept
250 {
251 return SysStringLen(m_h);
252 }
253
254 protected:
260 void free_internal() noexcept override
261 {
262 SysFreeString(m_h);
263 }
264
274 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
275 {
276 return SysAllocStringLen(h, SysStringLen(h));
277 }
278 };
279
283 #pragma warning(push)
284 #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.
285 class variant : public VARIANT
286 {
287 public:
291 variant() noexcept
292 {
293 VariantInit(this);
294 }
295
299 variant(_In_ const VARIANT& varSrc)
300 {
301 vt = VT_EMPTY;
302 const HRESULT hr = VariantCopy(this, &varSrc);
303 if (FAILED(hr))
304 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
305 }
306
310 #pragma warning(suppress: 26495) // vt member is initialized as a result of memcpy()
311 variant(_Inout_ VARIANT&& varSrc) noexcept
312 {
313 memcpy(this, &varSrc, sizeof(VARIANT));
314 varSrc.vt = VT_EMPTY;
315 }
316
320 variant(_In_ bool bSrc) noexcept
321 {
322 vt = VT_BOOL;
323 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
324 }
325
329 variant(_In_ char cSrc) noexcept
330 {
331 vt = VT_I1;
332 cVal = cSrc;
333 }
334
338 variant(_In_ unsigned char nSrc) noexcept
339 {
340 vt = VT_UI1;
341 bVal = nSrc;
342 }
343
347 variant(_In_ short nSrc) noexcept
348 {
349 vt = VT_I2;
350 iVal = nSrc;
351 }
352
356 variant(_In_ unsigned short nSrc) noexcept
357 {
358 vt = VT_UI2;
359 uiVal = nSrc;
360 }
361
365 variant(_In_ int nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
366 {
367 assert(vtSrc == VT_I4 || vtSrc == VT_INT);
368 vt = vtSrc;
369 intVal = nSrc;
370 }
371
375 variant(_In_ unsigned int nSrc, _In_ VARTYPE vtSrc = VT_UI4) noexcept
376 {
377 assert(vtSrc == VT_UI4 || vtSrc == VT_UINT);
378 vt = vtSrc;
379 uintVal= nSrc;
380 }
381
385 variant(_In_ long nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
386 {
387 assert(vtSrc == VT_I4 || vtSrc == VT_ERROR);
388 vt = vtSrc;
389 lVal = nSrc;
390 }
391
395 variant(_In_ unsigned long nSrc) noexcept
396 {
397 vt = VT_UI4;
398 ulVal = nSrc;
399 }
400
404 variant(_In_ float fltSrc) noexcept
405 {
406 vt = VT_R4;
407 fltVal = fltSrc;
408 }
409
413 variant(_In_ double dblSrc, _In_ VARTYPE vtSrc = VT_R8) noexcept
414 {
415 assert(vtSrc == VT_R8 || vtSrc == VT_DATE);
416 vt = vtSrc;
417 dblVal = dblSrc;
418 }
419
423 variant(_In_ long long nSrc) noexcept
424 {
425 vt = VT_I8;
426 llVal = nSrc;
427 }
428
432 variant(_In_ unsigned long long nSrc) noexcept
433 {
434 vt = VT_UI8;
435 ullVal = nSrc;
436 }
437
441 variant(_In_ CY cySrc) noexcept
442 {
443 vt = VT_CY;
444 cyVal.Hi = cySrc.Hi;
445 cyVal.Lo = cySrc.Lo;
446 }
447
451 variant(_In_z_ LPCOLESTR lpszSrc) noexcept
452 {
453 vt = VT_EMPTY;
454 *this = lpszSrc;
455 }
456
460 variant(_In_z_ BSTR bstr) noexcept
461 {
462 vt = VT_EMPTY;
463 *this = bstr;
464 }
465
469 variant(_In_opt_ IDispatch* pSrc)
470 {
471 vt = VT_DISPATCH;
472 pdispVal = pSrc;
473
474 if (pdispVal != NULL)
475 pdispVal->AddRef();
476 }
477
481 variant(_In_opt_ IUnknown* pSrc)
482 {
483 vt = VT_UNKNOWN;
484 punkVal = pSrc;
485
486 if (punkVal != NULL)
487 punkVal->AddRef();
488 }
489
493 variant(_In_ const SAFEARRAY *pSrc)
494 {
495 assert(pSrc != NULL);
496
497 LPSAFEARRAY pCopy;
498 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
499 if (FAILED(hr))
500 throw winstd::com_runtime_error(hr, "SafeArrayCopy failed.");
501
502 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
503 vt |= VT_ARRAY;
504 parray = pCopy;
505 }
506
510 virtual ~variant()
511 {
512 VariantClear(this);
513 }
514
518 variant& operator=(_In_ const VARIANT& varSrc)
519 {
520 if (this != &varSrc) {
521 const HRESULT hr = VariantCopy(this, &varSrc);
522 if (FAILED(hr))
523 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
524 }
525 return *this;
526 }
527
531 variant& operator=(_Inout_ VARIANT&& varSrc) noexcept
532 {
533 if (this != &varSrc) {
534 VariantClear(this);
535 memcpy(this, &varSrc, sizeof(VARIANT));
536 varSrc.vt = VT_EMPTY;
537 }
538 return *this;
539 }
540
544 variant& operator=(_In_ bool bSrc) noexcept
545 {
546 if (vt != VT_BOOL) {
547 VariantClear(this);
548 vt = VT_BOOL;
549 }
550 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
551 return *this;
552 }
553
557 variant& operator=(_In_ char cSrc) noexcept
558 {
559 if (vt != VT_I1) {
560 VariantClear(this);
561 vt = VT_I1;
562 }
563 cVal = cSrc;
564 return *this;
565 }
566
570 variant& operator=(_In_ unsigned char nSrc) noexcept
571 {
572 if (vt != VT_UI1) {
573 VariantClear(this);
574 vt = VT_UI1;
575 }
576 bVal = nSrc;
577 return *this;
578 }
579
583 variant& operator=(_In_ short nSrc) noexcept
584 {
585 if (vt != VT_I2) {
586 VariantClear(this);
587 vt = VT_I2;
588 }
589 iVal = nSrc;
590 return *this;
591 }
592
596 variant& operator=(_In_ unsigned short nSrc) noexcept
597 {
598 if (vt != VT_UI2) {
599 VariantClear(this);
600 vt = VT_UI2;
601 }
602 uiVal = nSrc;
603 return *this;
604 }
605
609 variant& operator=(_In_ int nSrc) noexcept
610 {
611 if (vt != VT_I4) {
612 VariantClear(this);
613 vt = VT_I4;
614 }
615 intVal = nSrc;
616 return *this;
617 }
618
622 variant& operator=(_In_ unsigned int nSrc) noexcept
623 {
624 if (vt != VT_UI4) {
625 VariantClear(this);
626 vt = VT_UI4;
627 }
628 uintVal= nSrc;
629 return *this;
630 }
631
635 variant& operator=(_In_ long nSrc) noexcept
636 {
637 if (vt != VT_I4) {
638 VariantClear(this);
639 vt = VT_I4;
640 }
641 lVal = nSrc;
642 return *this;
643 }
644
648 variant& operator=(_In_ unsigned long nSrc) noexcept
649 {
650 if (vt != VT_UI4) {
651 VariantClear(this);
652 vt = VT_UI4;
653 }
654 ulVal = nSrc;
655 return *this;
656 }
657
661 variant& operator=(_In_ long long nSrc) noexcept
662 {
663 if (vt != VT_I8) {
664 VariantClear(this);
665 vt = VT_I8;
666 }
667 llVal = nSrc;
668 return *this;
669 }
670
674 variant& operator=(_In_ unsigned long long nSrc) noexcept
675 {
676 if (vt != VT_UI8) {
677 VariantClear(this);
678 vt = VT_UI8;
679 }
680 ullVal = nSrc;
681
682 return *this;
683 }
684
688 variant& operator=(_In_ float fltSrc) noexcept
689 {
690 if (vt != VT_R4) {
691 VariantClear(this);
692 vt = VT_R4;
693 }
694 fltVal = fltSrc;
695 return *this;
696 }
697
701 variant& operator=(_In_ double dblSrc) noexcept
702 {
703 if (vt != VT_R8) {
704 VariantClear(this);
705 vt = VT_R8;
706 }
707 dblVal = dblSrc;
708 return *this;
709 }
710
714 variant& operator=(_In_ CY cySrc) noexcept
715 {
716 if (vt != VT_CY) {
717 VariantClear(this);
718 vt = VT_CY;
719 }
720 cyVal.Hi = cySrc.Hi;
721 cyVal.Lo = cySrc.Lo;
722 return *this;
723 }
724
728 variant& operator=(_In_z_ LPCOLESTR lpszSrc) noexcept
729 {
730 VariantClear(this);
731 vt = VT_BSTR;
732 bstrVal = SysAllocString(lpszSrc);
733 return *this;
734 }
735
739 variant& operator=(_Inout_opt_ IDispatch* pSrc)
740 {
741 VariantClear(this);
742 vt = VT_DISPATCH;
743 pdispVal = pSrc;
744 if (pdispVal != NULL)
745 pdispVal->AddRef();
746 return *this;
747 }
748
752 variant& operator=(_Inout_opt_ IUnknown* pSrc)
753 {
754 VariantClear(this);
755 vt = VT_UNKNOWN;
756 punkVal = pSrc;
757 if (punkVal != NULL)
758 punkVal->AddRef();
759 return *this;
760 }
761
765 variant& operator=(_In_ unsigned char* pbSrc) noexcept
766 {
767 if (vt != (VT_UI1|VT_BYREF)) {
768 VariantClear(this);
769 vt = VT_UI1|VT_BYREF;
770 }
771 pbVal = pbSrc;
772 return *this;
773 }
774
778 variant& operator=(_In_ short* pnSrc) noexcept
779 {
780 if (vt != (VT_I2|VT_BYREF)) {
781 VariantClear(this);
782 vt = VT_I2|VT_BYREF;
783 }
784 piVal = pnSrc;
785 return *this;
786 }
787
791 variant& operator=(_In_ unsigned short* pnSrc) noexcept
792 {
793 if (vt != (VT_UI2|VT_BYREF)) {
794 VariantClear(this);
795 vt = VT_UI2|VT_BYREF;
796 }
797 puiVal = pnSrc;
798 return *this;
799 }
800
804 variant& operator=(_In_ int* pnSrc) noexcept
805 {
806 if (vt != (VT_I4|VT_BYREF)) {
807 VariantClear(this);
808 vt = VT_I4|VT_BYREF;
809 }
810 pintVal = pnSrc;
811 return *this;
812 }
813
817 variant& operator=(_In_ unsigned int* pnSrc) noexcept
818 {
819 if (vt != (VT_UI4|VT_BYREF)) {
820 VariantClear(this);
821 vt = VT_UI4|VT_BYREF;
822 }
823 puintVal = pnSrc;
824 return *this;
825 }
826
830 variant& operator=(_In_ long* pnSrc) noexcept
831 {
832 if (vt != (VT_I4|VT_BYREF)) {
833 VariantClear(this);
834 vt = VT_I4|VT_BYREF;
835 }
836 plVal = pnSrc;
837 return *this;
838 }
839
843 variant& operator=(_In_ unsigned long* pnSrc) noexcept
844 {
845 if (vt != (VT_UI4|VT_BYREF)) {
846 VariantClear(this);
847 vt = VT_UI4|VT_BYREF;
848 }
849 pulVal = pnSrc;
850 return *this;
851 }
852
856 variant& operator=(_In_ long long* pnSrc) noexcept
857 {
858 if (vt != (VT_I8|VT_BYREF)) {
859 VariantClear(this);
860 vt = VT_I8|VT_BYREF;
861 }
862 pllVal = pnSrc;
863 return *this;
864 }
865
869 variant& operator=(_In_ unsigned long long* pnSrc) noexcept
870 {
871 if (vt != (VT_UI8|VT_BYREF)) {
872 VariantClear(this);
873 vt = VT_UI8|VT_BYREF;
874 }
875 pullVal = pnSrc;
876 return *this;
877 }
878
882 variant& operator=(_In_ float* pfSrc) noexcept
883 {
884 if (vt != (VT_R4|VT_BYREF)) {
885 VariantClear(this);
886 vt = VT_R4|VT_BYREF;
887 }
888 pfltVal = pfSrc;
889 return *this;
890 }
891
895 variant& operator=(_In_ double* pfSrc) noexcept
896 {
897 if (vt != (VT_R8|VT_BYREF)) {
898 VariantClear(this);
899 vt = VT_R8|VT_BYREF;
900 }
901 pdblVal = pfSrc;
902 return *this;
903 }
904
908 variant& operator=(_In_ const SAFEARRAY *pSrc) noexcept
909 {
910 assert(pSrc != NULL);
911 VariantClear(this);
912
913 LPSAFEARRAY pCopy;
914 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
915 if (SUCCEEDED(hr)) {
916 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
917 vt |= VT_ARRAY;
918 parray = pCopy;
919 } else
920 assert(0);
921
922 return *this;
923 }
924
925 public:
934 bool operator==(_In_ const VARIANT& varSrc) const noexcept
935 {
936 if (vt == VT_NULL && varSrc.vt == VT_NULL) return true;
937 if (vt != varSrc.vt) return false;
938 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0) == static_cast<HRESULT>(VARCMP_EQ);
939 }
940
949 bool operator!=(_In_ const VARIANT& varSrc) const noexcept
950 {
951 return !operator==(varSrc);
952 }
953
962 bool operator<(_In_ const VARIANT& varSrc) const noexcept
963 {
964 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
965 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_LT);
966 }
967
976 bool operator>(_In_ const VARIANT& varSrc) const noexcept
977 {
978 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
979 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_GT);
980 }
981
990 bool operator<=(_In_ const VARIANT& varSrc) const noexcept
991 {
992 return !operator>(varSrc);
993 }
994
1003 bool operator>=(_In_ const VARIANT& varSrc) const noexcept
1004 {
1005 return !operator<(varSrc);
1006 }
1007
1013 HRESULT change_type(_In_ VARTYPE _vt, _In_opt_ USHORT wFlags = 0) noexcept
1014 {
1015 return VariantChangeType(this, this, wFlags, _vt);
1016 }
1017
1018 private:
1020 HRESULT compare(_In_ const VARIANT &varLeft, _In_ const VARIANT &varRight, _In_ LCID lcid, _In_ ULONG dwFlags) const noexcept
1021 {
1022 switch(vt) {
1023 case VT_I1: return varLeft.cVal == varRight.cVal ? VARCMP_EQ : varLeft.cVal > varRight.cVal ? VARCMP_GT : VARCMP_LT;
1024 case VT_UI2: return varLeft.uiVal == varRight.uiVal ? VARCMP_EQ : varLeft.uiVal > varRight.uiVal ? VARCMP_GT : VARCMP_LT;
1025 case VT_UI4: return varLeft.uintVal == varRight.uintVal ? VARCMP_EQ : varLeft.uintVal > varRight.uintVal ? VARCMP_GT : VARCMP_LT;
1026 case VT_UI8: return varLeft.ullVal == varRight.ullVal ? VARCMP_EQ : varLeft.ullVal > varRight.ullVal ? VARCMP_GT : VARCMP_LT;
1027 default: return VarCmp(const_cast<LPVARIANT>(&varLeft), const_cast<LPVARIANT>(&varRight), lcid, dwFlags);
1028 }
1029 }
1031 };
1032 #pragma warning(pop)
1033
1038 {
1041
1042 public:
1048 com_initializer(_In_opt_ LPVOID pvReserved) noexcept
1049 {
1050 m_result = CoInitialize(pvReserved);
1051 }
1052
1058 com_initializer(_In_opt_ LPVOID pvReserved, _In_ DWORD dwCoInit) noexcept
1059 {
1060 m_result = CoInitializeEx(pvReserved, dwCoInit);
1061 }
1062
1069 {
1070 if (SUCCEEDED(m_result))
1071 CoUninitialize();
1072 }
1073
1079 HRESULT status() const noexcept
1080 {
1081 return m_result;
1082 }
1083
1084 protected:
1085 HRESULT m_result;
1086 };
1087
1089}
1090
1093
1099template <class T>
1100static _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter, _In_ DWORD dwClsContext, _Inout_ winstd::com_obj<T> &v)
1101{
1102 T* ppv;
1103 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&ppv);
1104 if (SUCCEEDED(hr))
1105 v.attach(ppv);
1106 return hr;
1107}
1108
BSTR string wrapper.
Definition: COM.h:204
bstr(LPCOLESTR src) noexcept
Constructs BSTR from OLE string.
Definition: COM.h:211
virtual ~bstr()
Destroys the string.
Definition: COM.h:238
handle_type duplicate_internal(handle_type h) const noexcept override
Duplicates the string.
Definition: COM.h:274
bstr(const std::basic_string< wchar_t, _Traits, _Ax > &src) noexcept
Constructs BSTR from std::basic_string.
Definition: COM.h:228
bstr(LPCOLESTR src, UINT len) noexcept
Constructs BSTR from OLE string with length.
Definition: COM.h:219
void free_internal() noexcept override
Destroys the string.
Definition: COM.h:260
UINT length() const noexcept
Returns the length of the string.
Definition: COM.h:249
Context scope automatic COM (un)initialization.
Definition: COM.h:1038
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:1058
com_initializer(LPVOID pvReserved) noexcept
Initializes the COM library on the current thread and identifies the concurrency model as single-thre...
Definition: COM.h:1048
HRESULT status() const noexcept
Return result of CoInitialize() call.
Definition: COM.h:1079
virtual ~com_initializer()
Uninitializes COM.
Definition: COM.h:1068
HRESULT m_result
Result of CoInitialize call.
Definition: COM.h:1085
COM object wrapper template.
Definition: COM.h:82
__declspec(deprecated("Use CoCreateInstance")) com_obj(REFCLSID rclsid
Constructs a new object and creates a new class with it.
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
virtual handle_type duplicate_internal(handle_type h) const noexcept=0
Abstract member function that must be implemented by child classes to do the actual object handle dup...
virtual void free_internal() noexcept=0
Abstract member function that must be implemented by child classes to do the actual object destructio...
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
void attach(handle_type h) noexcept
Sets a new object handle for the class.
Definition: Common.h:817
Numerical runtime error.
Definition: Common.h:1002
HRESULT error_type
Error number type.
Definition: Common.h:1004
VARIANT struct wrapper.
Definition: COM.h:286
bool operator<=(const VARIANT &varSrc) const noexcept
Is variant less than or equal to?
Definition: COM.h:990
variant(bool bSrc) noexcept
Constructs VARIANT from bool.
Definition: COM.h:320
variant & operator=(unsigned int nSrc) noexcept
Copy from unsigned int value.
Definition: COM.h:622
variant & operator=(unsigned long nSrc) noexcept
Copy from unsigned long value.
Definition: COM.h:648
variant(float fltSrc) noexcept
Constructs VARIANT from float.
Definition: COM.h:404
variant(VARIANT &&varSrc) noexcept
Moves VARIANT from another.
Definition: COM.h:311
variant & operator=(float fltSrc) noexcept
Copy from float value.
Definition: COM.h:688
variant & operator=(float *pfSrc) noexcept
Copy from float reference.
Definition: COM.h:882
variant(IDispatch *pSrc)
Constructs VARIANT from IDispatch.
Definition: COM.h:469
variant(int nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from integer.
Definition: COM.h:365
variant(const SAFEARRAY *pSrc)
Constructs VARIANT from SAFEARRAY.
Definition: COM.h:493
variant & operator=(double *pfSrc) noexcept
Copy from double reference.
Definition: COM.h:895
variant & operator=(int *pnSrc) noexcept
Copy from int reference.
Definition: COM.h:804
bool operator>(const VARIANT &varSrc) const noexcept
Is variant greater than?
Definition: COM.h:976
variant & operator=(bool bSrc) noexcept
Copy from bool value.
Definition: COM.h:544
variant & operator=(long nSrc) noexcept
Copy from long value.
Definition: COM.h:635
variant & operator=(const SAFEARRAY *pSrc) noexcept
Copy from SAFEARRAY.
Definition: COM.h:908
HRESULT change_type(VARTYPE _vt, USHORT wFlags=0) noexcept
Converts a variant from one type to another.
Definition: COM.h:1013
variant & operator=(IUnknown *pSrc)
Copy from IUnknown.
Definition: COM.h:752
variant & operator=(short nSrc) noexcept
Copy from short value.
Definition: COM.h:583
variant & operator=(unsigned char *pbSrc) noexcept
Copy from unsigned char reference.
Definition: COM.h:765
variant & operator=(unsigned short nSrc) noexcept
Copy from unsigned short value.
Definition: COM.h:596
variant & operator=(unsigned char nSrc) noexcept
Copy from unsigned char value.
Definition: COM.h:570
variant & operator=(char cSrc) noexcept
Copy from char value.
Definition: COM.h:557
variant(LPCOLESTR lpszSrc) noexcept
Constructs VARIANT from OLE string.
Definition: COM.h:451
virtual ~variant()
Destroys VARIANT.
Definition: COM.h:510
variant(const VARIANT &varSrc)
Constructs VARIANT from another.
Definition: COM.h:299
variant(unsigned char nSrc) noexcept
Constructs VARIANT from byte.
Definition: COM.h:338
variant & operator=(double dblSrc) noexcept
Copy from double value.
Definition: COM.h:701
bool operator!=(const VARIANT &varSrc) const noexcept
Is variant not equal to?
Definition: COM.h:949
variant & operator=(int nSrc) noexcept
Copy from int value.
Definition: COM.h:609
variant(unsigned long nSrc) noexcept
Constructs VARIANT from unsigned long.
Definition: COM.h:395
bool operator==(const VARIANT &varSrc) const noexcept
Is variant equal to?
Definition: COM.h:934
variant(IUnknown *pSrc)
Constructs VARIANT from IUnknown.
Definition: COM.h:481
variant(unsigned int nSrc, VARTYPE vtSrc=VT_UI4) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:375
variant & operator=(CY cySrc) noexcept
Copy from CY value.
Definition: COM.h:714
variant & operator=(LPCOLESTR lpszSrc) noexcept
Copy from OLE string value.
Definition: COM.h:728
variant(long long nSrc) noexcept
Constructs VARIANT from 64-bit integer.
Definition: COM.h:423
variant & operator=(unsigned int *pnSrc) noexcept
Copy from unsigned int reference.
Definition: COM.h:817
variant(long nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from long.
Definition: COM.h:385
variant & operator=(long *pnSrc) noexcept
Copy from long reference.
Definition: COM.h:830
variant(unsigned short nSrc) noexcept
Constructs VARIANT from unsigned short.
Definition: COM.h:356
bool operator>=(const VARIANT &varSrc) const noexcept
Is variant greater than or equal to?
Definition: COM.h:1003
variant & operator=(short *pnSrc) noexcept
Copy from short reference.
Definition: COM.h:778
variant() noexcept
Constructs blank VARIANT.
Definition: COM.h:291
bool operator<(const VARIANT &varSrc) const noexcept
Is variant less than?
Definition: COM.h:962
variant(unsigned long long nSrc) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:432
variant(char cSrc) noexcept
Constructs VARIANT from character.
Definition: COM.h:329
variant & operator=(unsigned short *pnSrc) noexcept
Copy from unsigned short reference.
Definition: COM.h:791
variant & operator=(long long *pnSrc) noexcept
Copy from long long reference.
Definition: COM.h:856
variant(BSTR bstr) noexcept
Constructs VARIANT from BSTR.
Definition: COM.h:460
variant & operator=(unsigned long long *pnSrc) noexcept
Copy from unsigned long long reference.
Definition: COM.h:869
variant(double dblSrc, VARTYPE vtSrc=VT_R8) noexcept
Constructs VARIANT from double or variant date.
Definition: COM.h:413
variant(short nSrc) noexcept
Constructs VARIANT from short.
Definition: COM.h:347
variant(CY cySrc) noexcept
Constructs VARIANT from CY (64-bit integer)
Definition: COM.h:441
variant & operator=(unsigned long long nSrc) noexcept
Copy from unsigned long long value.
Definition: COM.h:674
variant & operator=(VARIANT &&varSrc) noexcept
Moves from another VARIANT.
Definition: COM.h:531
variant & operator=(long long nSrc) noexcept
Copy from long long value.
Definition: COM.h:661
variant & operator=(IDispatch *pSrc)
Copy from IDispatch.
Definition: COM.h:739
variant & operator=(unsigned long *pnSrc) noexcept
Copy from unsigned long reference.
Definition: COM.h:843
variant & operator=(const VARIANT &varSrc)
Copy from another VARIANT.
Definition: COM.h:518
#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