WinStd
Windows Win32 API using Standard C++
Loading...
Searching...
No Matches
COM.h
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 1991-2023 Amebis
4 Copyright © 2016 GÉANT
5*/
6
8
9#pragma once
10
11#include "Common.h"
12#include <unknwn.h>
13#include <string>
14
15namespace winstd
16{
19
25 class com_runtime_error : public num_runtime_error<HRESULT>
26 {
27 public:
34 com_runtime_error(_In_ error_type num, _In_ const std::string& msg) : num_runtime_error<HRESULT>(num, msg)
35 {
36 }
37
44 com_runtime_error(_In_ error_type num, _In_opt_z_ const char *msg = nullptr) : num_runtime_error<HRESULT>(num, msg)
45 {
46 }
47 };
48
50
53
58 {
63
69 template <class _T>
70 void operator()(_T *_Ptr) const
71 {
72 CoTaskMemFree(_Ptr);
73 }
74 };
75
81 template <class T>
82 class com_obj : public dplhandle<T*, NULL>
83 {
85
86 public:
92 template <class _Other>
93 com_obj(_In_ _Other *other)
94 {
95 assert(other);
96 other->QueryInterface(__uuidof(T), (void**)&m_h);
97 }
98
104 template <class _Other>
106 {
107 other->QueryInterface(__uuidof(T), (void**)&m_h);
108 }
109
113 virtual ~com_obj()
114 {
115 if (m_h != invalid)
117 }
118
124 template <class _Other>
125 HRESULT query_interface(_Out_ _Other **h) const
126 {
127 assert(h);
128 assert(m_h);
129 return m_h->QueryInterface(__uuidof(_Other), (void**)h);
130 }
131
137 template <class _Other>
138 HRESULT query_interface(_Out_ com_obj<_Other> &h) const
139 {
140 assert(m_h);
141 _Other *_h;
142 HRESULT hr = m_h->QueryInterface(__uuidof(_Other), (void**)&_h);
143 if (SUCCEEDED(hr))
144 h.attach(_h);
145 return hr;
146 }
147
148 protected:
154 void free_internal() noexcept override
155 {
156 m_h->Release();
157 }
158
168 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
169 {
170 h->AddRef();
171 return h;
172 }
173 };
174
178 class bstr : public dplhandle<BSTR, NULL>
179 {
181
182 public:
186 bstr(_In_ LPCOLESTR src) noexcept
187 {
188 m_h = SysAllocString(src);
189 }
190
194 bstr(_In_ LPCOLESTR src, _In_ UINT len) noexcept
195 {
196 m_h = SysAllocStringLen(src, len);
197 }
198
202 template<class _Traits, class _Ax>
203 bstr(_In_ const std::basic_string<wchar_t, _Traits, _Ax> &src) noexcept
204 {
205 m_h = SysAllocStringLen(src.c_str(), (UINT)src.length());
206 }
207
213 virtual ~bstr()
214 {
215 if (m_h != invalid)
217 }
218
224 UINT length() const noexcept
225 {
226 return SysStringLen(m_h);
227 }
228
229 protected:
235 void free_internal() noexcept override
236 {
237 SysFreeString(m_h);
238 }
239
249 handle_type duplicate_internal(_In_ handle_type h) const noexcept override
250 {
251 return SysAllocStringLen(h, SysStringLen(h));
252 }
253 };
254
258 #pragma warning(push)
259 #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.
260 class variant : public VARIANT
261 {
262 public:
266 variant() noexcept
267 {
268 VariantInit(this);
269 }
270
274 variant(_In_ const VARIANT& varSrc)
275 {
276 vt = VT_EMPTY;
277 const HRESULT hr = VariantCopy(this, &varSrc);
278 if (FAILED(hr))
279 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
280 }
281
285 #pragma warning(suppress: 26495) // vt member is initialized as a result of memcpy()
286 variant(_Inout_ VARIANT&& varSrc) noexcept
287 {
288 memcpy(this, &varSrc, sizeof(VARIANT));
289 varSrc.vt = VT_EMPTY;
290 }
291
295 variant(_In_ bool bSrc) noexcept
296 {
297 vt = VT_BOOL;
298 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
299 }
300
304 variant(_In_ char cSrc) noexcept
305 {
306 vt = VT_I1;
307 cVal = cSrc;
308 }
309
313 variant(_In_ unsigned char nSrc) noexcept
314 {
315 vt = VT_UI1;
316 bVal = nSrc;
317 }
318
322 variant(_In_ short nSrc) noexcept
323 {
324 vt = VT_I2;
325 iVal = nSrc;
326 }
327
331 variant(_In_ unsigned short nSrc) noexcept
332 {
333 vt = VT_UI2;
334 uiVal = nSrc;
335 }
336
340 variant(_In_ int nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
341 {
342 assert(vtSrc == VT_I4 || vtSrc == VT_INT);
343 vt = vtSrc;
344 intVal = nSrc;
345 }
346
350 variant(_In_ unsigned int nSrc, _In_ VARTYPE vtSrc = VT_UI4) noexcept
351 {
352 assert(vtSrc == VT_UI4 || vtSrc == VT_UINT);
353 vt = vtSrc;
354 uintVal= nSrc;
355 }
356
360 variant(_In_ long nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
361 {
362 assert(vtSrc == VT_I4 || vtSrc == VT_ERROR);
363 vt = vtSrc;
364 lVal = nSrc;
365 }
366
370 variant(_In_ unsigned long nSrc) noexcept
371 {
372 vt = VT_UI4;
373 ulVal = nSrc;
374 }
375
379 variant(_In_ float fltSrc) noexcept
380 {
381 vt = VT_R4;
382 fltVal = fltSrc;
383 }
384
388 variant(_In_ double dblSrc, _In_ VARTYPE vtSrc = VT_R8) noexcept
389 {
390 assert(vtSrc == VT_R8 || vtSrc == VT_DATE);
391 vt = vtSrc;
392 dblVal = dblSrc;
393 }
394
398 variant(_In_ long long nSrc) noexcept
399 {
400 vt = VT_I8;
401 llVal = nSrc;
402 }
403
407 variant(_In_ unsigned long long nSrc) noexcept
408 {
409 vt = VT_UI8;
410 ullVal = nSrc;
411 }
412
416 variant(_In_ CY cySrc) noexcept
417 {
418 vt = VT_CY;
419 cyVal.Hi = cySrc.Hi;
420 cyVal.Lo = cySrc.Lo;
421 }
422
426 variant(_In_z_ LPCOLESTR lpszSrc) noexcept
427 {
428 vt = VT_EMPTY;
429 *this = lpszSrc;
430 }
431
435 variant(_In_z_ BSTR bstr) noexcept
436 {
437 vt = VT_EMPTY;
438 *this = bstr;
439 }
440
444 variant(_In_opt_ IDispatch* pSrc)
445 {
446 vt = VT_DISPATCH;
447 pdispVal = pSrc;
448
449 if (pdispVal != NULL)
450 pdispVal->AddRef();
451 }
452
456 variant(_In_opt_ IUnknown* pSrc)
457 {
458 vt = VT_UNKNOWN;
459 punkVal = pSrc;
460
461 if (punkVal != NULL)
462 punkVal->AddRef();
463 }
464
468 variant(_In_ const SAFEARRAY *pSrc)
469 {
470 assert(pSrc != NULL);
471
472 LPSAFEARRAY pCopy;
473 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
474 if (FAILED(hr))
475 throw winstd::com_runtime_error(hr, "SafeArrayCopy failed.");
476
477 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
478 vt |= VT_ARRAY;
479 parray = pCopy;
480 }
481
485 virtual ~variant()
486 {
487 VariantClear(this);
488 }
489
493 variant& operator=(_In_ const VARIANT& varSrc)
494 {
495 if (this != &varSrc) {
496 const HRESULT hr = VariantCopy(this, &varSrc);
497 if (FAILED(hr))
498 throw winstd::com_runtime_error(hr, "VariantCopy failed.");
499 }
500 return *this;
501 }
502
506 variant& operator=(_Inout_ VARIANT&& varSrc) noexcept
507 {
508 if (this != &varSrc) {
509 VariantClear(this);
510 memcpy(this, &varSrc, sizeof(VARIANT));
511 varSrc.vt = VT_EMPTY;
512 }
513 return *this;
514 }
515
519 variant& operator=(_In_ bool bSrc) noexcept
520 {
521 if (vt != VT_BOOL) {
522 VariantClear(this);
523 vt = VT_BOOL;
524 }
525 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
526 return *this;
527 }
528
532 variant& operator=(_In_ char cSrc) noexcept
533 {
534 if (vt != VT_I1) {
535 VariantClear(this);
536 vt = VT_I1;
537 }
538 cVal = cSrc;
539 return *this;
540 }
541
545 variant& operator=(_In_ unsigned char nSrc) noexcept
546 {
547 if (vt != VT_UI1) {
548 VariantClear(this);
549 vt = VT_UI1;
550 }
551 bVal = nSrc;
552 return *this;
553 }
554
558 variant& operator=(_In_ short nSrc) noexcept
559 {
560 if (vt != VT_I2) {
561 VariantClear(this);
562 vt = VT_I2;
563 }
564 iVal = nSrc;
565 return *this;
566 }
567
571 variant& operator=(_In_ unsigned short nSrc) noexcept
572 {
573 if (vt != VT_UI2) {
574 VariantClear(this);
575 vt = VT_UI2;
576 }
577 uiVal = nSrc;
578 return *this;
579 }
580
584 variant& operator=(_In_ int nSrc) noexcept
585 {
586 if (vt != VT_I4) {
587 VariantClear(this);
588 vt = VT_I4;
589 }
590 intVal = nSrc;
591 return *this;
592 }
593
597 variant& operator=(_In_ unsigned int nSrc) noexcept
598 {
599 if (vt != VT_UI4) {
600 VariantClear(this);
601 vt = VT_UI4;
602 }
603 uintVal= nSrc;
604 return *this;
605 }
606
610 variant& operator=(_In_ long nSrc) noexcept
611 {
612 if (vt != VT_I4) {
613 VariantClear(this);
614 vt = VT_I4;
615 }
616 lVal = nSrc;
617 return *this;
618 }
619
623 variant& operator=(_In_ unsigned long nSrc) noexcept
624 {
625 if (vt != VT_UI4) {
626 VariantClear(this);
627 vt = VT_UI4;
628 }
629 ulVal = nSrc;
630 return *this;
631 }
632
636 variant& operator=(_In_ long long nSrc) noexcept
637 {
638 if (vt != VT_I8) {
639 VariantClear(this);
640 vt = VT_I8;
641 }
642 llVal = nSrc;
643 return *this;
644 }
645
649 variant& operator=(_In_ unsigned long long nSrc) noexcept
650 {
651 if (vt != VT_UI8) {
652 VariantClear(this);
653 vt = VT_UI8;
654 }
655 ullVal = nSrc;
656
657 return *this;
658 }
659
663 variant& operator=(_In_ float fltSrc) noexcept
664 {
665 if (vt != VT_R4) {
666 VariantClear(this);
667 vt = VT_R4;
668 }
669 fltVal = fltSrc;
670 return *this;
671 }
672
676 variant& operator=(_In_ double dblSrc) noexcept
677 {
678 if (vt != VT_R8) {
679 VariantClear(this);
680 vt = VT_R8;
681 }
682 dblVal = dblSrc;
683 return *this;
684 }
685
689 variant& operator=(_In_ CY cySrc) noexcept
690 {
691 if (vt != VT_CY) {
692 VariantClear(this);
693 vt = VT_CY;
694 }
695 cyVal.Hi = cySrc.Hi;
696 cyVal.Lo = cySrc.Lo;
697 return *this;
698 }
699
703 variant& operator=(_In_z_ LPCOLESTR lpszSrc) noexcept
704 {
705 VariantClear(this);
706 vt = VT_BSTR;
707 bstrVal = SysAllocString(lpszSrc);
708 return *this;
709 }
710
714 variant& operator=(_Inout_opt_ IDispatch* pSrc)
715 {
716 VariantClear(this);
717 vt = VT_DISPATCH;
718 pdispVal = pSrc;
719 if (pdispVal != NULL)
720 pdispVal->AddRef();
721 return *this;
722 }
723
727 variant& operator=(_Inout_opt_ IUnknown* pSrc)
728 {
729 VariantClear(this);
730 vt = VT_UNKNOWN;
731 punkVal = pSrc;
732 if (punkVal != NULL)
733 punkVal->AddRef();
734 return *this;
735 }
736
740 variant& operator=(_In_ unsigned char* pbSrc) noexcept
741 {
742 if (vt != (VT_UI1|VT_BYREF)) {
743 VariantClear(this);
744 vt = VT_UI1|VT_BYREF;
745 }
746 pbVal = pbSrc;
747 return *this;
748 }
749
753 variant& operator=(_In_ short* pnSrc) noexcept
754 {
755 if (vt != (VT_I2|VT_BYREF)) {
756 VariantClear(this);
757 vt = VT_I2|VT_BYREF;
758 }
759 piVal = pnSrc;
760 return *this;
761 }
762
766 variant& operator=(_In_ unsigned short* pnSrc) noexcept
767 {
768 if (vt != (VT_UI2|VT_BYREF)) {
769 VariantClear(this);
770 vt = VT_UI2|VT_BYREF;
771 }
772 puiVal = pnSrc;
773 return *this;
774 }
775
779 variant& operator=(_In_ int* pnSrc) noexcept
780 {
781 if (vt != (VT_I4|VT_BYREF)) {
782 VariantClear(this);
783 vt = VT_I4|VT_BYREF;
784 }
785 pintVal = pnSrc;
786 return *this;
787 }
788
792 variant& operator=(_In_ unsigned int* pnSrc) noexcept
793 {
794 if (vt != (VT_UI4|VT_BYREF)) {
795 VariantClear(this);
796 vt = VT_UI4|VT_BYREF;
797 }
798 puintVal = pnSrc;
799 return *this;
800 }
801
805 variant& operator=(_In_ long* pnSrc) noexcept
806 {
807 if (vt != (VT_I4|VT_BYREF)) {
808 VariantClear(this);
809 vt = VT_I4|VT_BYREF;
810 }
811 plVal = pnSrc;
812 return *this;
813 }
814
818 variant& operator=(_In_ unsigned long* pnSrc) noexcept
819 {
820 if (vt != (VT_UI4|VT_BYREF)) {
821 VariantClear(this);
822 vt = VT_UI4|VT_BYREF;
823 }
824 pulVal = pnSrc;
825 return *this;
826 }
827
831 variant& operator=(_In_ long long* pnSrc) noexcept
832 {
833 if (vt != (VT_I8|VT_BYREF)) {
834 VariantClear(this);
835 vt = VT_I8|VT_BYREF;
836 }
837 pllVal = pnSrc;
838 return *this;
839 }
840
844 variant& operator=(_In_ unsigned long long* pnSrc) noexcept
845 {
846 if (vt != (VT_UI8|VT_BYREF)) {
847 VariantClear(this);
848 vt = VT_UI8|VT_BYREF;
849 }
850 pullVal = pnSrc;
851 return *this;
852 }
853
857 variant& operator=(_In_ float* pfSrc) noexcept
858 {
859 if (vt != (VT_R4|VT_BYREF)) {
860 VariantClear(this);
861 vt = VT_R4|VT_BYREF;
862 }
863 pfltVal = pfSrc;
864 return *this;
865 }
866
870 variant& operator=(_In_ double* pfSrc) noexcept
871 {
872 if (vt != (VT_R8|VT_BYREF)) {
873 VariantClear(this);
874 vt = VT_R8|VT_BYREF;
875 }
876 pdblVal = pfSrc;
877 return *this;
878 }
879
883 variant& operator=(_In_ const SAFEARRAY *pSrc) noexcept
884 {
885 assert(pSrc != NULL);
886 VariantClear(this);
887
888 LPSAFEARRAY pCopy;
889 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
890 if (SUCCEEDED(hr)) {
891 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
892 vt |= VT_ARRAY;
893 parray = pCopy;
894 } else
895 assert(0);
896
897 return *this;
898 }
899
900 public:
909 bool operator==(_In_ const VARIANT& varSrc) const noexcept
910 {
911 if (vt == VT_NULL && varSrc.vt == VT_NULL) return true;
912 if (vt != varSrc.vt) return false;
913 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0) == static_cast<HRESULT>(VARCMP_EQ);
914 }
915
924 bool operator!=(_In_ const VARIANT& varSrc) const noexcept
925 {
926 return !operator==(varSrc);
927 }
928
937 bool operator<(_In_ const VARIANT& varSrc) const noexcept
938 {
939 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
940 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_LT);
941 }
942
951 bool operator>(_In_ const VARIANT& varSrc) const noexcept
952 {
953 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
954 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_GT);
955 }
956
965 bool operator<=(_In_ const VARIANT& varSrc) const noexcept
966 {
967 return !operator>(varSrc);
968 }
969
978 bool operator>=(_In_ const VARIANT& varSrc) const noexcept
979 {
980 return !operator<(varSrc);
981 }
982
988 HRESULT change_type(_In_ VARTYPE _vt, _In_opt_ USHORT wFlags = 0) noexcept
989 {
990 return VariantChangeType(this, this, wFlags, _vt);
991 }
992
993 private:
995 HRESULT compare(_In_ const VARIANT &varLeft, _In_ const VARIANT &varRight, _In_ LCID lcid, _In_ ULONG dwFlags) const noexcept
996 {
997 switch(vt) {
998 case VT_I1: return varLeft.cVal == varRight.cVal ? VARCMP_EQ : varLeft.cVal > varRight.cVal ? VARCMP_GT : VARCMP_LT;
999 case VT_UI2: return varLeft.uiVal == varRight.uiVal ? VARCMP_EQ : varLeft.uiVal > varRight.uiVal ? VARCMP_GT : VARCMP_LT;
1000 case VT_UI4: return varLeft.uintVal == varRight.uintVal ? VARCMP_EQ : varLeft.uintVal > varRight.uintVal ? VARCMP_GT : VARCMP_LT;
1001 case VT_UI8: return varLeft.ullVal == varRight.ullVal ? VARCMP_EQ : varLeft.ullVal > varRight.ullVal ? VARCMP_GT : VARCMP_LT;
1002 default: return VarCmp(const_cast<LPVARIANT>(&varLeft), const_cast<LPVARIANT>(&varRight), lcid, dwFlags);
1003 }
1004 }
1006 };
1007 #pragma warning(pop)
1008
1013 {
1016
1017 public:
1023 com_initializer(_In_opt_ LPVOID pvReserved) noexcept
1024 {
1025 m_result = CoInitialize(pvReserved);
1026 }
1027
1033 com_initializer(_In_opt_ LPVOID pvReserved, _In_ DWORD dwCoInit) noexcept
1034 {
1035 m_result = CoInitializeEx(pvReserved, dwCoInit);
1036 }
1037
1044 {
1045 if (SUCCEEDED(m_result))
1046 CoUninitialize();
1047 }
1048
1054 HRESULT status() const noexcept
1055 {
1056 return m_result;
1057 }
1058
1059 protected:
1060 HRESULT m_result;
1061 };
1062
1064}
1065
1068
1074template <class T>
1075static _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter, _In_ DWORD dwClsContext, _Inout_ winstd::com_obj<T> &v)
1076{
1077 T* ppv;
1078 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&ppv);
1079 if (SUCCEEDED(hr))
1080 v.attach(ppv);
1081 return hr;
1082}
1083
1089template <class T>
1090static _Check_return_ HRESULT CoGetObject(_In_ LPCWSTR pszName, _In_opt_ BIND_OPTS* pBindOptions, _In_ REFIID riid, _Inout_ winstd::com_obj<T>& v)
1091{
1092 T* ppv;
1093 HRESULT hr = CoGetObject(pszName, pBindOptions, riid, (LPVOID*)&ppv);
1094 if (SUCCEEDED(hr))
1095 v.attach(ppv);
1096 return hr;
1097}
1098
BSTR string wrapper.
Definition: COM.h:179
bstr(LPCOLESTR src) noexcept
Constructs BSTR from OLE string.
Definition: COM.h:186
virtual ~bstr()
Destroys the string.
Definition: COM.h:213
handle_type duplicate_internal(handle_type h) const noexcept override
Duplicates the string.
Definition: COM.h:249
bstr(const std::basic_string< wchar_t, _Traits, _Ax > &src) noexcept
Constructs BSTR from std::basic_string.
Definition: COM.h:203
bstr(LPCOLESTR src, UINT len) noexcept
Constructs BSTR from OLE string with length.
Definition: COM.h:194
void free_internal() noexcept override
Destroys the string.
Definition: COM.h:235
UINT length() const noexcept
Returns the length of the string.
Definition: COM.h:224
Context scope automatic COM (un)initialization.
Definition: COM.h:1013
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:1033
com_initializer(LPVOID pvReserved) noexcept
Initializes the COM library on the current thread and identifies the concurrency model as single-thre...
Definition: COM.h:1023
HRESULT status() const noexcept
Return result of CoInitialize() call.
Definition: COM.h:1054
virtual ~com_initializer()
Uninitializes COM.
Definition: COM.h:1043
HRESULT m_result
Result of CoInitialize call.
Definition: COM.h:1060
COM object wrapper template.
Definition: COM.h:83
void free_internal() noexcept override
Releases the object by decrementing reference counter.
Definition: COM.h:154
handle_type duplicate_internal(handle_type h) const noexcept override
Duplicates the object by incrementing the reference counter.
Definition: COM.h:168
HRESULT query_interface(_Other **h) const
Queries the object for another interface.
Definition: COM.h:125
HRESULT query_interface(com_obj< _Other > &h) const
Queries the object for another interface.
Definition: COM.h:138
virtual ~com_obj()
Releases object.
Definition: COM.h:113
com_obj(_Other *other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:93
com_obj(com_obj< _Other > &other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:105
COM runtime error.
Definition: COM.h:26
com_runtime_error(error_type num, const std::string &msg)
Constructs an exception.
Definition: COM.h:34
com_runtime_error(error_type num, const char *msg=nullptr)
Constructs an exception.
Definition: COM.h:44
Base abstract template class to support object handle keeping for objects that support trivial handle...
Definition: Common.h:834
T handle_type
Datatype of the object handle this template class handles.
Definition: Common.h:574
handle_type m_h
Object handle.
Definition: Common.h:823
Numerical runtime error.
Definition: Common.h:968
HRESULT error_type
Error number type.
Definition: Common.h:970
VARIANT struct wrapper.
Definition: COM.h:261
bool operator<=(const VARIANT &varSrc) const noexcept
Is variant less than or equal to?
Definition: COM.h:965
variant(bool bSrc) noexcept
Constructs VARIANT from bool.
Definition: COM.h:295
variant & operator=(unsigned int nSrc) noexcept
Copy from unsigned int value.
Definition: COM.h:597
variant & operator=(unsigned long nSrc) noexcept
Copy from unsigned long value.
Definition: COM.h:623
variant(float fltSrc) noexcept
Constructs VARIANT from float.
Definition: COM.h:379
variant(VARIANT &&varSrc) noexcept
Moves VARIANT from another.
Definition: COM.h:286
variant & operator=(float fltSrc) noexcept
Copy from float value.
Definition: COM.h:663
variant & operator=(float *pfSrc) noexcept
Copy from float reference.
Definition: COM.h:857
variant(IDispatch *pSrc)
Constructs VARIANT from IDispatch.
Definition: COM.h:444
variant(int nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from integer.
Definition: COM.h:340
variant(const SAFEARRAY *pSrc)
Constructs VARIANT from SAFEARRAY.
Definition: COM.h:468
variant & operator=(double *pfSrc) noexcept
Copy from double reference.
Definition: COM.h:870
variant & operator=(int *pnSrc) noexcept
Copy from int reference.
Definition: COM.h:779
bool operator>(const VARIANT &varSrc) const noexcept
Is variant greater than?
Definition: COM.h:951
variant & operator=(bool bSrc) noexcept
Copy from bool value.
Definition: COM.h:519
variant & operator=(long nSrc) noexcept
Copy from long value.
Definition: COM.h:610
variant & operator=(const SAFEARRAY *pSrc) noexcept
Copy from SAFEARRAY.
Definition: COM.h:883
HRESULT change_type(VARTYPE _vt, USHORT wFlags=0) noexcept
Converts a variant from one type to another.
Definition: COM.h:988
variant & operator=(IUnknown *pSrc)
Copy from IUnknown.
Definition: COM.h:727
variant & operator=(short nSrc) noexcept
Copy from short value.
Definition: COM.h:558
variant & operator=(unsigned char *pbSrc) noexcept
Copy from unsigned char reference.
Definition: COM.h:740
variant & operator=(unsigned short nSrc) noexcept
Copy from unsigned short value.
Definition: COM.h:571
variant & operator=(unsigned char nSrc) noexcept
Copy from unsigned char value.
Definition: COM.h:545
variant & operator=(char cSrc) noexcept
Copy from char value.
Definition: COM.h:532
variant(LPCOLESTR lpszSrc) noexcept
Constructs VARIANT from OLE string.
Definition: COM.h:426
virtual ~variant()
Destroys VARIANT.
Definition: COM.h:485
variant(const VARIANT &varSrc)
Constructs VARIANT from another.
Definition: COM.h:274
variant(unsigned char nSrc) noexcept
Constructs VARIANT from byte.
Definition: COM.h:313
variant & operator=(double dblSrc) noexcept
Copy from double value.
Definition: COM.h:676
bool operator!=(const VARIANT &varSrc) const noexcept
Is variant not equal to?
Definition: COM.h:924
variant & operator=(int nSrc) noexcept
Copy from int value.
Definition: COM.h:584
variant(unsigned long nSrc) noexcept
Constructs VARIANT from unsigned long.
Definition: COM.h:370
bool operator==(const VARIANT &varSrc) const noexcept
Is variant equal to?
Definition: COM.h:909
variant(IUnknown *pSrc)
Constructs VARIANT from IUnknown.
Definition: COM.h:456
variant(unsigned int nSrc, VARTYPE vtSrc=VT_UI4) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:350
variant & operator=(CY cySrc) noexcept
Copy from CY value.
Definition: COM.h:689
variant & operator=(LPCOLESTR lpszSrc) noexcept
Copy from OLE string value.
Definition: COM.h:703
variant(long long nSrc) noexcept
Constructs VARIANT from 64-bit integer.
Definition: COM.h:398
variant & operator=(unsigned int *pnSrc) noexcept
Copy from unsigned int reference.
Definition: COM.h:792
variant(long nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from long.
Definition: COM.h:360
variant & operator=(long *pnSrc) noexcept
Copy from long reference.
Definition: COM.h:805
variant(unsigned short nSrc) noexcept
Constructs VARIANT from unsigned short.
Definition: COM.h:331
bool operator>=(const VARIANT &varSrc) const noexcept
Is variant greater than or equal to?
Definition: COM.h:978
variant & operator=(short *pnSrc) noexcept
Copy from short reference.
Definition: COM.h:753
variant() noexcept
Constructs blank VARIANT.
Definition: COM.h:266
bool operator<(const VARIANT &varSrc) const noexcept
Is variant less than?
Definition: COM.h:937
variant(unsigned long long nSrc) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:407
variant(char cSrc) noexcept
Constructs VARIANT from character.
Definition: COM.h:304
variant & operator=(unsigned short *pnSrc) noexcept
Copy from unsigned short reference.
Definition: COM.h:766
variant & operator=(long long *pnSrc) noexcept
Copy from long long reference.
Definition: COM.h:831
variant(BSTR bstr) noexcept
Constructs VARIANT from BSTR.
Definition: COM.h:435
variant & operator=(unsigned long long *pnSrc) noexcept
Copy from unsigned long long reference.
Definition: COM.h:844
variant(double dblSrc, VARTYPE vtSrc=VT_R8) noexcept
Constructs VARIANT from double or variant date.
Definition: COM.h:388
variant(short nSrc) noexcept
Constructs VARIANT from short.
Definition: COM.h:322
variant(CY cySrc) noexcept
Constructs VARIANT from CY (64-bit integer)
Definition: COM.h:416
variant & operator=(unsigned long long nSrc) noexcept
Copy from unsigned long long value.
Definition: COM.h:649
variant & operator=(VARIANT &&varSrc) noexcept
Moves from another VARIANT.
Definition: COM.h:506
variant & operator=(long long nSrc) noexcept
Copy from long long value.
Definition: COM.h:636
variant & operator=(IDispatch *pSrc)
Copy from IDispatch.
Definition: COM.h:714
variant & operator=(unsigned long *pnSrc) noexcept
Copy from unsigned long reference.
Definition: COM.h:818
variant & operator=(const VARIANT &varSrc)
Copy from another VARIANT.
Definition: COM.h:493
static _Check_return_ HRESULT CoGetObject(LPCWSTR pszName, BIND_OPTS *pBindOptions, REFIID riid, winstd::com_obj< T > &v)
Converts a display name into a moniker that identifies the object named, and then binds to the object...
Definition: COM.h:1090
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:1075
#define WINSTD_NONCOPYABLE(C)
Declares a class as non-copyable.
Definition: Common.h:66
#define WINSTD_NONMOVABLE(C)
Declares a class as non-movable.
Definition: Common.h:74
#define WINSTD_DPLHANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition: Common.h:175
static const T invalid
Invalid handle value.
Definition: Common.h:579
Deleter for unique_ptr using CoTaskMemFree.
Definition: COM.h:58
void operator()(_T *_Ptr) const
Delete a pointer.
Definition: COM.h:70
CoTaskMemFree_delete() noexcept
Default constructor.
Definition: COM.h:62