WinStd
Additional templates and function helpers for Microsoft Windows using Standard C++ classes
COM.h
Go to the documentation of this file.
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 1991-2022 Amebis
4 Copyright © 2016 GÉANT
5*/
6
14
15#pragma once
16
17#include "Common.h"
18#include <unknwn.h>
19#include <string>
20
21namespace winstd
22{
25
31 class com_runtime_error : public num_runtime_error<HRESULT>
32 {
33 public:
40 com_runtime_error(_In_ error_type num, _In_ const std::string& msg) : num_runtime_error<HRESULT>(num, msg)
41 {
42 }
43
50 com_runtime_error(_In_ error_type num, _In_opt_z_ const char *msg = nullptr) : num_runtime_error<HRESULT>(num, msg)
51 {
52 }
53 };
54
56
59
64 {
69
75 template <class _T>
76 void operator()(_T *_Ptr) const
77 {
78 CoTaskMemFree(_Ptr);
79 }
80 };
81
87 template <class T>
88 class com_obj : public dplhandle<T*, NULL>
89 {
91
92 public:
98 template <class _Other>
99 com_obj(_In_ _Other *other)
100 {
101 assert(other);
102 other->QueryInterface(__uuidof(T), (void**)&m_h);
103 }
104
110 template <class _Other>
112 {
113 other->QueryInterface(__uuidof(T), (void**)&m_h);
114 }
115
119 virtual ~com_obj()
120 {
121 if (m_h != invalid)
123 }
124
130 template <class _Other>
131 HRESULT query_interface(_Out_ _Other **h) const
132 {
133 assert(h);
134 assert(m_h);
135 return m_h->QueryInterface(__uuidof(_Other), (void**)h);
136 }
137
143 template <class _Other>
144 HRESULT query_interface(_Out_ com_obj<_Other> &h) const
145 {
146 assert(m_h);
147 _Other *_h;
148 HRESULT hr = m_h->QueryInterface(__uuidof(_Other), (void**)&_h);
149 if (SUCCEEDED(hr))
150 h.attach(_h);
151 return hr;
152 }
153
154 protected:
160 void free_internal() noexcept override
161 {
162 m_h->Release();
163 }
164
174 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
175 {
176 h->AddRef();
177 return h;
178 }
179 };
180
184 class bstr : public dplhandle<BSTR, NULL>
185 {
187
188 public:
192 bstr(_In_ LPCOLESTR src) noexcept
193 {
194 m_h = SysAllocString(src);
195 }
196
200 bstr(_In_ LPCOLESTR src, _In_ UINT len) noexcept
201 {
202 m_h = SysAllocStringLen(src, len);
203 }
204
208 template<class _Traits, class _Ax>
209 bstr(_In_ const std::basic_string<wchar_t, _Traits, _Ax> &src) noexcept
210 {
211 m_h = SysAllocStringLen(src.c_str(), (UINT)src.length());
212 }
213
219 virtual ~bstr()
220 {
221 if (m_h != invalid)
223 }
224
230 UINT length() const noexcept
231 {
232 return SysStringLen(m_h);
233 }
234
235 protected:
241 void free_internal() noexcept override
242 {
243 SysFreeString(m_h);
244 }
245
255 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
256 {
257 return SysAllocStringLen(h, SysStringLen(h));
258 }
259 };
260
264 #pragma warning(push)
265 #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.
266 class variant : public VARIANT
267 {
268 public:
272 variant() noexcept
273 {
274 VariantInit(this);
275 }
276
280 variant(_In_ const VARIANT& varSrc)
281 {
282 vt = VT_EMPTY;
283 const HRESULT hr = VariantCopy(this, &varSrc);
284 if (FAILED(hr))
285 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
286 }
287
291 #pragma warning(suppress: 26495) // vt member is initialized as a result of memcpy()
292 variant(_Inout_ VARIANT&& varSrc) noexcept
293 {
294 memcpy(this, &varSrc, sizeof(VARIANT));
295 varSrc.vt = VT_EMPTY;
296 }
297
301 variant(_In_ bool bSrc) noexcept
302 {
303 vt = VT_BOOL;
304 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
305 }
306
310 variant(_In_ char cSrc) noexcept
311 {
312 vt = VT_I1;
313 cVal = cSrc;
314 }
315
319 variant(_In_ unsigned char nSrc) noexcept
320 {
321 vt = VT_UI1;
322 bVal = nSrc;
323 }
324
328 variant(_In_ short nSrc) noexcept
329 {
330 vt = VT_I2;
331 iVal = nSrc;
332 }
333
337 variant(_In_ unsigned short nSrc) noexcept
338 {
339 vt = VT_UI2;
340 uiVal = nSrc;
341 }
342
346 variant(_In_ int nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
347 {
348 assert(vtSrc == VT_I4 || vtSrc == VT_INT);
349 vt = vtSrc;
350 intVal = nSrc;
351 }
352
356 variant(_In_ unsigned int nSrc, _In_ VARTYPE vtSrc = VT_UI4) noexcept
357 {
358 assert(vtSrc == VT_UI4 || vtSrc == VT_UINT);
359 vt = vtSrc;
360 uintVal= nSrc;
361 }
362
366 variant(_In_ long nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
367 {
368 assert(vtSrc == VT_I4 || vtSrc == VT_ERROR);
369 vt = vtSrc;
370 lVal = nSrc;
371 }
372
376 variant(_In_ unsigned long nSrc) noexcept
377 {
378 vt = VT_UI4;
379 ulVal = nSrc;
380 }
381
385 variant(_In_ float fltSrc) noexcept
386 {
387 vt = VT_R4;
388 fltVal = fltSrc;
389 }
390
394 variant(_In_ double dblSrc, _In_ VARTYPE vtSrc = VT_R8) noexcept
395 {
396 assert(vtSrc == VT_R8 || vtSrc == VT_DATE);
397 vt = vtSrc;
398 dblVal = dblSrc;
399 }
400
404 variant(_In_ long long nSrc) noexcept
405 {
406 vt = VT_I8;
407 llVal = nSrc;
408 }
409
413 variant(_In_ unsigned long long nSrc) noexcept
414 {
415 vt = VT_UI8;
416 ullVal = nSrc;
417 }
418
422 variant(_In_ CY cySrc) noexcept
423 {
424 vt = VT_CY;
425 cyVal.Hi = cySrc.Hi;
426 cyVal.Lo = cySrc.Lo;
427 }
428
432 variant(_In_z_ LPCOLESTR lpszSrc) noexcept
433 {
434 vt = VT_EMPTY;
435 *this = lpszSrc;
436 }
437
441 variant(_In_z_ BSTR bstr) noexcept
442 {
443 vt = VT_EMPTY;
444 *this = bstr;
445 }
446
450 variant(_In_opt_ IDispatch* pSrc)
451 {
452 vt = VT_DISPATCH;
453 pdispVal = pSrc;
454
455 if (pdispVal != NULL)
456 pdispVal->AddRef();
457 }
458
462 variant(_In_opt_ IUnknown* pSrc)
463 {
464 vt = VT_UNKNOWN;
465 punkVal = pSrc;
466
467 if (punkVal != NULL)
468 punkVal->AddRef();
469 }
470
474 variant(_In_ const SAFEARRAY *pSrc)
475 {
476 assert(pSrc != NULL);
477
478 LPSAFEARRAY pCopy;
479 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
480 if (FAILED(hr))
481 throw winstd::com_runtime_error(hr, "SafeArrayCopy failed.");
482
483 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
484 vt |= VT_ARRAY;
485 parray = pCopy;
486 }
487
491 virtual ~variant()
492 {
493 VariantClear(this);
494 }
495
499 variant& operator=(_In_ const VARIANT& varSrc)
500 {
501 if (this != &varSrc) {
502 const HRESULT hr = VariantCopy(this, &varSrc);
503 if (FAILED(hr))
504 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
505 }
506 return *this;
507 }
508
512 variant& operator=(_Inout_ VARIANT&& varSrc) noexcept
513 {
514 if (this != &varSrc) {
515 VariantClear(this);
516 memcpy(this, &varSrc, sizeof(VARIANT));
517 varSrc.vt = VT_EMPTY;
518 }
519 return *this;
520 }
521
525 variant& operator=(_In_ bool bSrc) noexcept
526 {
527 if (vt != VT_BOOL) {
528 VariantClear(this);
529 vt = VT_BOOL;
530 }
531 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
532 return *this;
533 }
534
538 variant& operator=(_In_ char cSrc) noexcept
539 {
540 if (vt != VT_I1) {
541 VariantClear(this);
542 vt = VT_I1;
543 }
544 cVal = cSrc;
545 return *this;
546 }
547
551 variant& operator=(_In_ unsigned char nSrc) noexcept
552 {
553 if (vt != VT_UI1) {
554 VariantClear(this);
555 vt = VT_UI1;
556 }
557 bVal = nSrc;
558 return *this;
559 }
560
564 variant& operator=(_In_ short nSrc) noexcept
565 {
566 if (vt != VT_I2) {
567 VariantClear(this);
568 vt = VT_I2;
569 }
570 iVal = nSrc;
571 return *this;
572 }
573
577 variant& operator=(_In_ unsigned short nSrc) noexcept
578 {
579 if (vt != VT_UI2) {
580 VariantClear(this);
581 vt = VT_UI2;
582 }
583 uiVal = nSrc;
584 return *this;
585 }
586
590 variant& operator=(_In_ int nSrc) noexcept
591 {
592 if (vt != VT_I4) {
593 VariantClear(this);
594 vt = VT_I4;
595 }
596 intVal = nSrc;
597 return *this;
598 }
599
603 variant& operator=(_In_ unsigned int nSrc) noexcept
604 {
605 if (vt != VT_UI4) {
606 VariantClear(this);
607 vt = VT_UI4;
608 }
609 uintVal= nSrc;
610 return *this;
611 }
612
616 variant& operator=(_In_ long nSrc) noexcept
617 {
618 if (vt != VT_I4) {
619 VariantClear(this);
620 vt = VT_I4;
621 }
622 lVal = nSrc;
623 return *this;
624 }
625
629 variant& operator=(_In_ unsigned long nSrc) noexcept
630 {
631 if (vt != VT_UI4) {
632 VariantClear(this);
633 vt = VT_UI4;
634 }
635 ulVal = nSrc;
636 return *this;
637 }
638
642 variant& operator=(_In_ long long nSrc) noexcept
643 {
644 if (vt != VT_I8) {
645 VariantClear(this);
646 vt = VT_I8;
647 }
648 llVal = nSrc;
649 return *this;
650 }
651
655 variant& operator=(_In_ unsigned long long nSrc) noexcept
656 {
657 if (vt != VT_UI8) {
658 VariantClear(this);
659 vt = VT_UI8;
660 }
661 ullVal = nSrc;
662
663 return *this;
664 }
665
669 variant& operator=(_In_ float fltSrc) noexcept
670 {
671 if (vt != VT_R4) {
672 VariantClear(this);
673 vt = VT_R4;
674 }
675 fltVal = fltSrc;
676 return *this;
677 }
678
682 variant& operator=(_In_ double dblSrc) noexcept
683 {
684 if (vt != VT_R8) {
685 VariantClear(this);
686 vt = VT_R8;
687 }
688 dblVal = dblSrc;
689 return *this;
690 }
691
695 variant& operator=(_In_ CY cySrc) noexcept
696 {
697 if (vt != VT_CY) {
698 VariantClear(this);
699 vt = VT_CY;
700 }
701 cyVal.Hi = cySrc.Hi;
702 cyVal.Lo = cySrc.Lo;
703 return *this;
704 }
705
709 variant& operator=(_In_z_ LPCOLESTR lpszSrc) noexcept
710 {
711 VariantClear(this);
712 vt = VT_BSTR;
713 bstrVal = SysAllocString(lpszSrc);
714 return *this;
715 }
716
720 variant& operator=(_Inout_opt_ IDispatch* pSrc)
721 {
722 VariantClear(this);
723 vt = VT_DISPATCH;
724 pdispVal = pSrc;
725 if (pdispVal != NULL)
726 pdispVal->AddRef();
727 return *this;
728 }
729
733 variant& operator=(_Inout_opt_ IUnknown* pSrc)
734 {
735 VariantClear(this);
736 vt = VT_UNKNOWN;
737 punkVal = pSrc;
738 if (punkVal != NULL)
739 punkVal->AddRef();
740 return *this;
741 }
742
746 variant& operator=(_In_ unsigned char* pbSrc) noexcept
747 {
748 if (vt != (VT_UI1|VT_BYREF)) {
749 VariantClear(this);
750 vt = VT_UI1|VT_BYREF;
751 }
752 pbVal = pbSrc;
753 return *this;
754 }
755
759 variant& operator=(_In_ short* pnSrc) noexcept
760 {
761 if (vt != (VT_I2|VT_BYREF)) {
762 VariantClear(this);
763 vt = VT_I2|VT_BYREF;
764 }
765 piVal = pnSrc;
766 return *this;
767 }
768
772 variant& operator=(_In_ unsigned short* pnSrc) noexcept
773 {
774 if (vt != (VT_UI2|VT_BYREF)) {
775 VariantClear(this);
776 vt = VT_UI2|VT_BYREF;
777 }
778 puiVal = pnSrc;
779 return *this;
780 }
781
785 variant& operator=(_In_ int* pnSrc) noexcept
786 {
787 if (vt != (VT_I4|VT_BYREF)) {
788 VariantClear(this);
789 vt = VT_I4|VT_BYREF;
790 }
791 pintVal = pnSrc;
792 return *this;
793 }
794
798 variant& operator=(_In_ unsigned int* pnSrc) noexcept
799 {
800 if (vt != (VT_UI4|VT_BYREF)) {
801 VariantClear(this);
802 vt = VT_UI4|VT_BYREF;
803 }
804 puintVal = pnSrc;
805 return *this;
806 }
807
811 variant& operator=(_In_ long* pnSrc) noexcept
812 {
813 if (vt != (VT_I4|VT_BYREF)) {
814 VariantClear(this);
815 vt = VT_I4|VT_BYREF;
816 }
817 plVal = pnSrc;
818 return *this;
819 }
820
824 variant& operator=(_In_ unsigned long* pnSrc) noexcept
825 {
826 if (vt != (VT_UI4|VT_BYREF)) {
827 VariantClear(this);
828 vt = VT_UI4|VT_BYREF;
829 }
830 pulVal = pnSrc;
831 return *this;
832 }
833
837 variant& operator=(_In_ long long* pnSrc) noexcept
838 {
839 if (vt != (VT_I8|VT_BYREF)) {
840 VariantClear(this);
841 vt = VT_I8|VT_BYREF;
842 }
843 pllVal = pnSrc;
844 return *this;
845 }
846
850 variant& operator=(_In_ unsigned long long* pnSrc) noexcept
851 {
852 if (vt != (VT_UI8|VT_BYREF)) {
853 VariantClear(this);
854 vt = VT_UI8|VT_BYREF;
855 }
856 pullVal = pnSrc;
857 return *this;
858 }
859
863 variant& operator=(_In_ float* pfSrc) noexcept
864 {
865 if (vt != (VT_R4|VT_BYREF)) {
866 VariantClear(this);
867 vt = VT_R4|VT_BYREF;
868 }
869 pfltVal = pfSrc;
870 return *this;
871 }
872
876 variant& operator=(_In_ double* pfSrc) noexcept
877 {
878 if (vt != (VT_R8|VT_BYREF)) {
879 VariantClear(this);
880 vt = VT_R8|VT_BYREF;
881 }
882 pdblVal = pfSrc;
883 return *this;
884 }
885
889 variant& operator=(_In_ const SAFEARRAY *pSrc) noexcept
890 {
891 assert(pSrc != NULL);
892 VariantClear(this);
893
894 LPSAFEARRAY pCopy;
895 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
896 if (SUCCEEDED(hr)) {
897 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
898 vt |= VT_ARRAY;
899 parray = pCopy;
900 } else
901 assert(0);
902
903 return *this;
904 }
905
906 public:
915 bool operator==(_In_ const VARIANT& varSrc) const noexcept
916 {
917 if (vt == VT_NULL && varSrc.vt == VT_NULL) return true;
918 if (vt != varSrc.vt) return false;
919 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0) == static_cast<HRESULT>(VARCMP_EQ);
920 }
921
930 bool operator!=(_In_ const VARIANT& varSrc) const noexcept
931 {
932 return !operator==(varSrc);
933 }
934
943 bool operator<(_In_ const VARIANT& varSrc) const noexcept
944 {
945 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
946 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_LT);
947 }
948
957 bool operator>(_In_ const VARIANT& varSrc) const noexcept
958 {
959 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
960 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_GT);
961 }
962
971 bool operator<=(_In_ const VARIANT& varSrc) const noexcept
972 {
973 return !operator>(varSrc);
974 }
975
984 bool operator>=(_In_ const VARIANT& varSrc) const noexcept
985 {
986 return !operator<(varSrc);
987 }
988
994 HRESULT change_type(_In_ VARTYPE _vt, _In_opt_ USHORT wFlags = 0) noexcept
995 {
996 return VariantChangeType(this, this, wFlags, _vt);
997 }
998
999 private:
1001 HRESULT compare(_In_ const VARIANT &varLeft, _In_ const VARIANT &varRight, _In_ LCID lcid, _In_ ULONG dwFlags) const noexcept
1002 {
1003 switch(vt) {
1004 case VT_I1: return varLeft.cVal == varRight.cVal ? VARCMP_EQ : varLeft.cVal > varRight.cVal ? VARCMP_GT : VARCMP_LT;
1005 case VT_UI2: return varLeft.uiVal == varRight.uiVal ? VARCMP_EQ : varLeft.uiVal > varRight.uiVal ? VARCMP_GT : VARCMP_LT;
1006 case VT_UI4: return varLeft.uintVal == varRight.uintVal ? VARCMP_EQ : varLeft.uintVal > varRight.uintVal ? VARCMP_GT : VARCMP_LT;
1007 case VT_UI8: return varLeft.ullVal == varRight.ullVal ? VARCMP_EQ : varLeft.ullVal > varRight.ullVal ? VARCMP_GT : VARCMP_LT;
1008 default: return VarCmp(const_cast<LPVARIANT>(&varLeft), const_cast<LPVARIANT>(&varRight), lcid, dwFlags);
1009 }
1010 }
1012 };
1013 #pragma warning(pop)
1014
1019 {
1022
1023 public:
1029 com_initializer(_In_opt_ LPVOID pvReserved) noexcept
1030 {
1031 m_result = CoInitialize(pvReserved);
1032 }
1033
1039 com_initializer(_In_opt_ LPVOID pvReserved, _In_ DWORD dwCoInit) noexcept
1040 {
1041 m_result = CoInitializeEx(pvReserved, dwCoInit);
1042 }
1043
1050 {
1051 if (SUCCEEDED(m_result))
1052 CoUninitialize();
1053 }
1054
1060 HRESULT status() const noexcept
1061 {
1062 return m_result;
1063 }
1064
1065 protected:
1066 HRESULT m_result;
1067 };
1068
1070}
1071
1074
1080template <class T>
1081static _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter, _In_ DWORD dwClsContext, _Inout_ winstd::com_obj<T> &v)
1082{
1083 T* ppv;
1084 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&ppv);
1085 if (SUCCEEDED(hr))
1086 v.attach(ppv);
1087 return hr;
1088}
1089
General API.
BSTR string wrapper.
Definition: COM.h:185
bstr(LPCOLESTR src) noexcept
Constructs BSTR from OLE string.
Definition: COM.h:192
virtual ~bstr()
Destroys the string.
Definition: COM.h:219
handle_type duplicate_internal(handle_type h) const noexcept override
Duplicates the string.
Definition: COM.h:255
bstr(const std::basic_string< wchar_t, _Traits, _Ax > &src) noexcept
Constructs BSTR from std::basic_string.
Definition: COM.h:209
bstr(LPCOLESTR src, UINT len) noexcept
Constructs BSTR from OLE string with length.
Definition: COM.h:200
void free_internal() noexcept override
Destroys the string.
Definition: COM.h:241
UINT length() const noexcept
Returns the length of the string.
Definition: COM.h:230
Context scope automatic COM (un)initialization.
Definition: COM.h:1019
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:1039
com_initializer(LPVOID pvReserved) noexcept
Initializes the COM library on the current thread and identifies the concurrency model as single-thre...
Definition: COM.h:1029
HRESULT status() const noexcept
Return result of CoInitialize() call.
Definition: COM.h:1060
virtual ~com_initializer()
Uninitializes COM.
Definition: COM.h:1049
HRESULT m_result
Result of CoInitialize call.
Definition: COM.h:1066
COM object wrapper template.
Definition: COM.h:89
void free_internal() noexcept override
Releases the object by decrementing reference counter.
Definition: COM.h:160
handle_type duplicate_internal(handle_type h) const noexcept override
Duplicates the object by incrementing the reference counter.
Definition: COM.h:174
HRESULT query_interface(_Other **h) const
Queries the object for another interface.
Definition: COM.h:131
HRESULT query_interface(com_obj< _Other > &h) const
Queries the object for another interface.
Definition: COM.h:144
virtual ~com_obj()
Releases object.
Definition: COM.h:119
com_obj(_Other *other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:99
com_obj(com_obj< _Other > &other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:111
COM runtime error.
Definition: COM.h:32
com_runtime_error(error_type num, const std::string &msg)
Constructs an exception.
Definition: COM.h:40
com_runtime_error(error_type num, const char *msg=nullptr)
Constructs an exception.
Definition: COM.h:50
Base abstract template class to support object handle keeping for objects that support trivial handle...
Definition: Common.h:877
T * handle_type
Datatype of the object handle this template class handles.
Definition: Common.h:620
handle_type m_h
Object handle.
Definition: Common.h:866
Numerical runtime error.
Definition: Common.h:1011
HRESULT error_type
Error number type.
Definition: Common.h:1013
VARIANT struct wrapper.
Definition: COM.h:267
bool operator<=(const VARIANT &varSrc) const noexcept
Is variant less than or equal to?
Definition: COM.h:971
variant(bool bSrc) noexcept
Constructs VARIANT from bool.
Definition: COM.h:301
variant & operator=(unsigned int nSrc) noexcept
Copy from unsigned int value.
Definition: COM.h:603
variant & operator=(unsigned long nSrc) noexcept
Copy from unsigned long value.
Definition: COM.h:629
variant(float fltSrc) noexcept
Constructs VARIANT from float.
Definition: COM.h:385
variant(VARIANT &&varSrc) noexcept
Moves VARIANT from another.
Definition: COM.h:292
variant & operator=(float fltSrc) noexcept
Copy from float value.
Definition: COM.h:669
variant & operator=(float *pfSrc) noexcept
Copy from float reference.
Definition: COM.h:863
variant(IDispatch *pSrc)
Constructs VARIANT from IDispatch.
Definition: COM.h:450
variant(int nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from integer.
Definition: COM.h:346
variant(const SAFEARRAY *pSrc)
Constructs VARIANT from SAFEARRAY.
Definition: COM.h:474
variant & operator=(double *pfSrc) noexcept
Copy from double reference.
Definition: COM.h:876
variant & operator=(int *pnSrc) noexcept
Copy from int reference.
Definition: COM.h:785
bool operator>(const VARIANT &varSrc) const noexcept
Is variant greater than?
Definition: COM.h:957
variant & operator=(bool bSrc) noexcept
Copy from bool value.
Definition: COM.h:525
variant & operator=(long nSrc) noexcept
Copy from long value.
Definition: COM.h:616
variant & operator=(const SAFEARRAY *pSrc) noexcept
Copy from SAFEARRAY.
Definition: COM.h:889
HRESULT change_type(VARTYPE _vt, USHORT wFlags=0) noexcept
Converts a variant from one type to another.
Definition: COM.h:994
variant & operator=(IUnknown *pSrc)
Copy from IUnknown.
Definition: COM.h:733
variant & operator=(short nSrc) noexcept
Copy from short value.
Definition: COM.h:564
variant & operator=(unsigned char *pbSrc) noexcept
Copy from unsigned char reference.
Definition: COM.h:746
variant & operator=(unsigned short nSrc) noexcept
Copy from unsigned short value.
Definition: COM.h:577
variant & operator=(unsigned char nSrc) noexcept
Copy from unsigned char value.
Definition: COM.h:551
variant & operator=(char cSrc) noexcept
Copy from char value.
Definition: COM.h:538
variant(LPCOLESTR lpszSrc) noexcept
Constructs VARIANT from OLE string.
Definition: COM.h:432
virtual ~variant()
Destroys VARIANT.
Definition: COM.h:491
variant(const VARIANT &varSrc)
Constructs VARIANT from another.
Definition: COM.h:280
variant(unsigned char nSrc) noexcept
Constructs VARIANT from byte.
Definition: COM.h:319
variant & operator=(double dblSrc) noexcept
Copy from double value.
Definition: COM.h:682
bool operator!=(const VARIANT &varSrc) const noexcept
Is variant not equal to?
Definition: COM.h:930
variant & operator=(int nSrc) noexcept
Copy from int value.
Definition: COM.h:590
variant(unsigned long nSrc) noexcept
Constructs VARIANT from unsigned long.
Definition: COM.h:376
bool operator==(const VARIANT &varSrc) const noexcept
Is variant equal to?
Definition: COM.h:915
variant(IUnknown *pSrc)
Constructs VARIANT from IUnknown.
Definition: COM.h:462
variant(unsigned int nSrc, VARTYPE vtSrc=VT_UI4) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:356
variant & operator=(CY cySrc) noexcept
Copy from CY value.
Definition: COM.h:695
variant & operator=(LPCOLESTR lpszSrc) noexcept
Copy from OLE string value.
Definition: COM.h:709
variant(long long nSrc) noexcept
Constructs VARIANT from 64-bit integer.
Definition: COM.h:404
variant & operator=(unsigned int *pnSrc) noexcept
Copy from unsigned int reference.
Definition: COM.h:798
variant(long nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from long.
Definition: COM.h:366
variant & operator=(long *pnSrc) noexcept
Copy from long reference.
Definition: COM.h:811
variant(unsigned short nSrc) noexcept
Constructs VARIANT from unsigned short.
Definition: COM.h:337
bool operator>=(const VARIANT &varSrc) const noexcept
Is variant greater than or equal to?
Definition: COM.h:984
variant & operator=(short *pnSrc) noexcept
Copy from short reference.
Definition: COM.h:759
variant() noexcept
Constructs blank VARIANT.
Definition: COM.h:272
bool operator<(const VARIANT &varSrc) const noexcept
Is variant less than?
Definition: COM.h:943
variant(unsigned long long nSrc) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:413
variant(char cSrc) noexcept
Constructs VARIANT from character.
Definition: COM.h:310
variant & operator=(unsigned short *pnSrc) noexcept
Copy from unsigned short reference.
Definition: COM.h:772
variant & operator=(long long *pnSrc) noexcept
Copy from long long reference.
Definition: COM.h:837
variant(BSTR bstr) noexcept
Constructs VARIANT from BSTR.
Definition: COM.h:441
variant & operator=(unsigned long long *pnSrc) noexcept
Copy from unsigned long long reference.
Definition: COM.h:850
variant(double dblSrc, VARTYPE vtSrc=VT_R8) noexcept
Constructs VARIANT from double or variant date.
Definition: COM.h:394
variant(short nSrc) noexcept
Constructs VARIANT from short.
Definition: COM.h:328
variant(CY cySrc) noexcept
Constructs VARIANT from CY (64-bit integer)
Definition: COM.h:422
variant & operator=(unsigned long long nSrc) noexcept
Copy from unsigned long long value.
Definition: COM.h:655
variant & operator=(VARIANT &&varSrc) noexcept
Moves from another VARIANT.
Definition: COM.h:512
variant & operator=(long long nSrc) noexcept
Copy from long long value.
Definition: COM.h:642
variant & operator=(IDispatch *pSrc)
Copy from IDispatch.
Definition: COM.h:720
variant & operator=(unsigned long *pnSrc) noexcept
Copy from unsigned long reference.
Definition: COM.h:824
variant & operator=(const VARIANT &varSrc)
Copy from another VARIANT.
Definition: COM.h:499
static _Check_return_ HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, winstd::com_obj< T > &v)
Creates and default-initializes a single object of the class associated with a specified CLSID.
Definition: COM.h:1081
#define WINSTD_NONCOPYABLE(C)
Declares a class as non-copyable.
Definition: Common.h:74
#define WINSTD_NONMOVABLE(C)
Declares a class as non-movable.
Definition: Common.h:82
#define WINSTD_DPLHANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition: Common.h:183
static const T * invalid
Invalid handle value.
Definition: Common.h:625
Deleter for unique_ptr using CoTaskMemFree.
Definition: COM.h:64
void operator()(_T *_Ptr) const
Delete a pointer.
Definition: COM.h:76
CoTaskMemFree_delete() noexcept
Default constructor.
Definition: COM.h:68