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:
93 _In_ REFCLSID rclsid,
94 _In_opt_ LPUNKNOWN pUnkOuter,
95 _In_ DWORD dwClsContext)
96 {
97 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&m_h);
98 if (FAILED(hr))
99 throw com_runtime_error(hr, "CoCreateInstance failed");
100 }
101
107 template <class _Other>
108 com_obj(_In_ _Other *other)
109 {
110 assert(other);
111 HRESULT hr = other->QueryInterface(__uuidof(T), (void**)&m_h);
112 if (FAILED(hr))
113 throw com_runtime_error(hr, "QueryInterface failed");
114 }
115
121 template <class _Other>
123 {
124 HRESULT hr = other->QueryInterface(__uuidof(T), (void**)&m_h);
125 if (FAILED(hr))
126 throw com_runtime_error(hr, "QueryInterface failed");
127 }
128
132 virtual ~com_obj()
133 {
134 if (m_h != invalid)
136 }
137
143 template <class _Other>
144 HRESULT query_interface(_Out_ _Other **h) const
145 {
146 assert(h);
147 assert(m_h);
148 return m_h->QueryInterface(__uuidof(_Other), (void**)h);
149 }
150
156 template <class _Other>
157 HRESULT query_interface(_Out_ com_obj<_Other> &h) const
158 {
159 assert(m_h);
160 _Other *_h;
161 HRESULT hr = m_h->QueryInterface(__uuidof(_Other), (void**)&_h);
162 if (SUCCEEDED(hr))
163 h.attach(_h);
164 return hr;
165 }
166
167 protected:
173 void free_internal() noexcept override
174 {
175 m_h->Release();
176 }
177
188 {
189 h->AddRef();
190 return h;
191 }
192 };
193
197 class bstr : public dplhandle<BSTR, NULL>
198 {
200
201 public:
205 bstr(_In_ LPCOLESTR src)
206 {
207 m_h = SysAllocString(src);
208 if (!m_h)
209 throw std::bad_alloc();
210 }
211
215 bstr(_In_ LPCOLESTR src, _In_ UINT len)
216 {
217 m_h = SysAllocStringLen(src, len);
218 if (!m_h)
219 throw std::bad_alloc();
220 }
221
225 template<class _Traits, class _Ax>
226 bstr(_In_ const std::basic_string<wchar_t, _Traits, _Ax> &src)
227 {
228 m_h = SysAllocStringLen(src.c_str(), (UINT)src.length());
229 if (!m_h)
230 throw std::bad_alloc();
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
275 {
276 handle_type h_new = SysAllocStringLen(h, SysStringLen(h));
277 if (h_new != invalid)
278 return h_new;
279 throw std::bad_alloc();
280 }
281 };
282
286 #pragma warning(push)
287 #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.
288 class variant : public VARIANT
289 {
290 public:
294 variant() noexcept
295 {
296 VariantInit(this);
297 }
298
302 variant(_In_ const VARIANT& varSrc)
303 {
304 vt = VT_EMPTY;
305 const HRESULT hr = VariantCopy(this, &varSrc);
306 if (FAILED(hr))
307 throw winstd::com_runtime_error(hr, "VariantCopy failed");
308 }
309
313 #pragma warning(suppress: 26495) // vt member is initialized as a result of memcpy()
314 variant(_Inout_ VARIANT&& varSrc) noexcept
315 {
316 memcpy(this, &varSrc, sizeof(VARIANT));
317 varSrc.vt = VT_EMPTY;
318 }
319
323 variant(_In_ bool bSrc) noexcept
324 {
325 vt = VT_BOOL;
326 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
327 }
328
332 variant(_In_ char cSrc) noexcept
333 {
334 vt = VT_I1;
335 cVal = cSrc;
336 }
337
341 variant(_In_ unsigned char nSrc) noexcept
342 {
343 vt = VT_UI1;
344 bVal = nSrc;
345 }
346
350 variant(_In_ short nSrc) noexcept
351 {
352 vt = VT_I2;
353 iVal = nSrc;
354 }
355
359 variant(_In_ unsigned short nSrc) noexcept
360 {
361 vt = VT_UI2;
362 uiVal = nSrc;
363 }
364
368 variant(_In_ int nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
369 {
370 assert(vtSrc == VT_I4 || vtSrc == VT_INT);
371 vt = vtSrc;
372 intVal = nSrc;
373 }
374
378 variant(_In_ unsigned int nSrc, _In_ VARTYPE vtSrc = VT_UI4) noexcept
379 {
380 assert(vtSrc == VT_UI4 || vtSrc == VT_UINT);
381 vt = vtSrc;
382 uintVal= nSrc;
383 }
384
388 variant(_In_ long nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
389 {
390 assert(vtSrc == VT_I4 || vtSrc == VT_ERROR);
391 vt = vtSrc;
392 lVal = nSrc;
393 }
394
398 variant(_In_ unsigned long nSrc) noexcept
399 {
400 vt = VT_UI4;
401 ulVal = nSrc;
402 }
403
407 variant(_In_ float fltSrc) noexcept
408 {
409 vt = VT_R4;
410 fltVal = fltSrc;
411 }
412
416 variant(_In_ double dblSrc, _In_ VARTYPE vtSrc = VT_R8) noexcept
417 {
418 assert(vtSrc == VT_R8 || vtSrc == VT_DATE);
419 vt = vtSrc;
420 dblVal = dblSrc;
421 }
422
426 variant(_In_ long long nSrc) noexcept
427 {
428 vt = VT_I8;
429 llVal = nSrc;
430 }
431
435 variant(_In_ unsigned long long nSrc) noexcept
436 {
437 vt = VT_UI8;
438 ullVal = nSrc;
439 }
440
444 variant(_In_ CY cySrc) noexcept
445 {
446 vt = VT_CY;
447 cyVal.Hi = cySrc.Hi;
448 cyVal.Lo = cySrc.Lo;
449 }
450
454 variant(_In_z_ LPCOLESTR lpszSrc) noexcept
455 {
456 vt = VT_EMPTY;
457 *this = lpszSrc;
458 }
459
463 variant(_In_z_ BSTR bstr) noexcept
464 {
465 vt = VT_EMPTY;
466 *this = bstr;
467 }
468
472 variant(_In_opt_ IDispatch* pSrc)
473 {
474 vt = VT_DISPATCH;
475 pdispVal = pSrc;
476
477 if (pdispVal != NULL)
478 pdispVal->AddRef();
479 }
480
484 variant(_In_opt_ IUnknown* pSrc)
485 {
486 vt = VT_UNKNOWN;
487 punkVal = pSrc;
488
489 if (punkVal != NULL)
490 punkVal->AddRef();
491 }
492
496 variant(_In_ const SAFEARRAY *pSrc)
497 {
498 assert(pSrc != NULL);
499
500 LPSAFEARRAY pCopy;
501 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
502 if (FAILED(hr))
503 throw winstd::com_runtime_error(hr, "SafeArrayCopy failed");
504
505 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
506 vt |= VT_ARRAY;
507 parray = pCopy;
508 }
509
513 virtual ~variant()
514 {
515 VariantClear(this);
516 }
517
521 variant& operator=(_In_ const VARIANT& varSrc)
522 {
523 if (this != &varSrc) {
524 const HRESULT hr = VariantCopy(this, &varSrc);
525 if (FAILED(hr))
526 throw winstd::com_runtime_error(hr, "VariantCopy failed");
527 }
528 return *this;
529 }
530
534 variant& operator=(_Inout_ VARIANT&& varSrc) noexcept
535 {
536 if (this != &varSrc) {
537 VariantClear(this);
538 memcpy(this, &varSrc, sizeof(VARIANT));
539 varSrc.vt = VT_EMPTY;
540 }
541 return *this;
542 }
543
547 variant& operator=(_In_ bool bSrc) noexcept
548 {
549 if (vt != VT_BOOL) {
550 VariantClear(this);
551 vt = VT_BOOL;
552 }
553 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
554 return *this;
555 }
556
560 variant& operator=(_In_ char cSrc) noexcept
561 {
562 if (vt != VT_I1) {
563 VariantClear(this);
564 vt = VT_I1;
565 }
566 cVal = cSrc;
567 return *this;
568 }
569
573 variant& operator=(_In_ unsigned char nSrc) noexcept
574 {
575 if (vt != VT_UI1) {
576 VariantClear(this);
577 vt = VT_UI1;
578 }
579 bVal = nSrc;
580 return *this;
581 }
582
586 variant& operator=(_In_ short nSrc) noexcept
587 {
588 if (vt != VT_I2) {
589 VariantClear(this);
590 vt = VT_I2;
591 }
592 iVal = nSrc;
593 return *this;
594 }
595
599 variant& operator=(_In_ unsigned short nSrc) noexcept
600 {
601 if (vt != VT_UI2) {
602 VariantClear(this);
603 vt = VT_UI2;
604 }
605 uiVal = nSrc;
606 return *this;
607 }
608
612 variant& operator=(_In_ int nSrc) noexcept
613 {
614 if (vt != VT_I4) {
615 VariantClear(this);
616 vt = VT_I4;
617 }
618 intVal = nSrc;
619 return *this;
620 }
621
625 variant& operator=(_In_ unsigned int nSrc) noexcept
626 {
627 if (vt != VT_UI4) {
628 VariantClear(this);
629 vt = VT_UI4;
630 }
631 uintVal= nSrc;
632 return *this;
633 }
634
638 variant& operator=(_In_ long nSrc) noexcept
639 {
640 if (vt != VT_I4) {
641 VariantClear(this);
642 vt = VT_I4;
643 }
644 lVal = nSrc;
645 return *this;
646 }
647
651 variant& operator=(_In_ unsigned long nSrc) noexcept
652 {
653 if (vt != VT_UI4) {
654 VariantClear(this);
655 vt = VT_UI4;
656 }
657 ulVal = nSrc;
658 return *this;
659 }
660
664 variant& operator=(_In_ long long nSrc) noexcept
665 {
666 if (vt != VT_I8) {
667 VariantClear(this);
668 vt = VT_I8;
669 }
670 llVal = nSrc;
671 return *this;
672 }
673
677 variant& operator=(_In_ unsigned long long nSrc) noexcept
678 {
679 if (vt != VT_UI8) {
680 VariantClear(this);
681 vt = VT_UI8;
682 }
683 ullVal = nSrc;
684
685 return *this;
686 }
687
691 variant& operator=(_In_ float fltSrc) noexcept
692 {
693 if (vt != VT_R4) {
694 VariantClear(this);
695 vt = VT_R4;
696 }
697 fltVal = fltSrc;
698 return *this;
699 }
700
704 variant& operator=(_In_ double dblSrc) noexcept
705 {
706 if (vt != VT_R8) {
707 VariantClear(this);
708 vt = VT_R8;
709 }
710 dblVal = dblSrc;
711 return *this;
712 }
713
717 variant& operator=(_In_ CY cySrc) noexcept
718 {
719 if (vt != VT_CY) {
720 VariantClear(this);
721 vt = VT_CY;
722 }
723 cyVal.Hi = cySrc.Hi;
724 cyVal.Lo = cySrc.Lo;
725 return *this;
726 }
727
731 variant& operator=(_In_z_ LPCOLESTR lpszSrc) noexcept
732 {
733 VariantClear(this);
734 vt = VT_BSTR;
735 bstrVal = SysAllocString(lpszSrc);
736 return *this;
737 }
738
742 variant& operator=(_Inout_opt_ IDispatch* pSrc)
743 {
744 VariantClear(this);
745 vt = VT_DISPATCH;
746 pdispVal = pSrc;
747 if (pdispVal != NULL)
748 pdispVal->AddRef();
749 return *this;
750 }
751
755 variant& operator=(_Inout_opt_ IUnknown* pSrc)
756 {
757 VariantClear(this);
758 vt = VT_UNKNOWN;
759 punkVal = pSrc;
760 if (punkVal != NULL)
761 punkVal->AddRef();
762 return *this;
763 }
764
768 variant& operator=(_In_ unsigned char* pbSrc) noexcept
769 {
770 if (vt != (VT_UI1|VT_BYREF)) {
771 VariantClear(this);
772 vt = VT_UI1|VT_BYREF;
773 }
774 pbVal = pbSrc;
775 return *this;
776 }
777
781 variant& operator=(_In_ short* pnSrc) noexcept
782 {
783 if (vt != (VT_I2|VT_BYREF)) {
784 VariantClear(this);
785 vt = VT_I2|VT_BYREF;
786 }
787 piVal = pnSrc;
788 return *this;
789 }
790
794 variant& operator=(_In_ unsigned short* pnSrc) noexcept
795 {
796 if (vt != (VT_UI2|VT_BYREF)) {
797 VariantClear(this);
798 vt = VT_UI2|VT_BYREF;
799 }
800 puiVal = pnSrc;
801 return *this;
802 }
803
807 variant& operator=(_In_ int* pnSrc) noexcept
808 {
809 if (vt != (VT_I4|VT_BYREF)) {
810 VariantClear(this);
811 vt = VT_I4|VT_BYREF;
812 }
813 pintVal = pnSrc;
814 return *this;
815 }
816
820 variant& operator=(_In_ unsigned int* pnSrc) noexcept
821 {
822 if (vt != (VT_UI4|VT_BYREF)) {
823 VariantClear(this);
824 vt = VT_UI4|VT_BYREF;
825 }
826 puintVal = pnSrc;
827 return *this;
828 }
829
833 variant& operator=(_In_ long* pnSrc) noexcept
834 {
835 if (vt != (VT_I4|VT_BYREF)) {
836 VariantClear(this);
837 vt = VT_I4|VT_BYREF;
838 }
839 plVal = pnSrc;
840 return *this;
841 }
842
846 variant& operator=(_In_ unsigned long* pnSrc) noexcept
847 {
848 if (vt != (VT_UI4|VT_BYREF)) {
849 VariantClear(this);
850 vt = VT_UI4|VT_BYREF;
851 }
852 pulVal = pnSrc;
853 return *this;
854 }
855
859 variant& operator=(_In_ long long* pnSrc) noexcept
860 {
861 if (vt != (VT_I8|VT_BYREF)) {
862 VariantClear(this);
863 vt = VT_I8|VT_BYREF;
864 }
865 pllVal = pnSrc;
866 return *this;
867 }
868
872 variant& operator=(_In_ unsigned long long* pnSrc) noexcept
873 {
874 if (vt != (VT_UI8|VT_BYREF)) {
875 VariantClear(this);
876 vt = VT_UI8|VT_BYREF;
877 }
878 pullVal = pnSrc;
879 return *this;
880 }
881
885 variant& operator=(_In_ float* pfSrc) noexcept
886 {
887 if (vt != (VT_R4|VT_BYREF)) {
888 VariantClear(this);
889 vt = VT_R4|VT_BYREF;
890 }
891 pfltVal = pfSrc;
892 return *this;
893 }
894
898 variant& operator=(_In_ double* pfSrc) noexcept
899 {
900 if (vt != (VT_R8|VT_BYREF)) {
901 VariantClear(this);
902 vt = VT_R8|VT_BYREF;
903 }
904 pdblVal = pfSrc;
905 return *this;
906 }
907
911 variant& operator=(_In_ const SAFEARRAY *pSrc)
912 {
913 assert(pSrc != NULL);
914 VariantClear(this);
915
916 LPSAFEARRAY pCopy;
917 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
918 if (SUCCEEDED(hr)) {
919 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
920 vt |= VT_ARRAY;
921 parray = pCopy;
922 return *this;
923 }
924 throw com_runtime_error(hr, "SafeArrayCopy failed");
925 }
926
927 public:
936 bool operator==(_In_ const VARIANT& varSrc) const noexcept
937 {
938 if (vt == VT_NULL && varSrc.vt == VT_NULL) return true;
939 if (vt != varSrc.vt) return false;
940 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0) == static_cast<HRESULT>(VARCMP_EQ);
941 }
942
951 bool operator!=(_In_ const VARIANT& varSrc) const noexcept
952 {
953 return !operator==(varSrc);
954 }
955
964 bool operator<(_In_ const VARIANT& varSrc) const noexcept
965 {
966 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
967 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_LT);
968 }
969
978 bool operator>(_In_ const VARIANT& varSrc) const noexcept
979 {
980 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
981 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_GT);
982 }
983
992 bool operator<=(_In_ const VARIANT& varSrc) const noexcept
993 {
994 return !operator>(varSrc);
995 }
996
1005 bool operator>=(_In_ const VARIANT& varSrc) const noexcept
1006 {
1007 return !operator<(varSrc);
1008 }
1009
1015 HRESULT change_type(_In_ VARTYPE _vt, _In_opt_ USHORT wFlags = 0) noexcept
1016 {
1017 return VariantChangeType(this, this, wFlags, _vt);
1018 }
1019
1020 private:
1022 HRESULT compare(_In_ const VARIANT &varLeft, _In_ const VARIANT &varRight, _In_ LCID lcid, _In_ ULONG dwFlags) const noexcept
1023 {
1024 switch(vt) {
1025 case VT_I1: return varLeft.cVal == varRight.cVal ? VARCMP_EQ : varLeft.cVal > varRight.cVal ? VARCMP_GT : VARCMP_LT;
1026 case VT_UI2: return varLeft.uiVal == varRight.uiVal ? VARCMP_EQ : varLeft.uiVal > varRight.uiVal ? VARCMP_GT : VARCMP_LT;
1027 case VT_UI4: return varLeft.uintVal == varRight.uintVal ? VARCMP_EQ : varLeft.uintVal > varRight.uintVal ? VARCMP_GT : VARCMP_LT;
1028 case VT_UI8: return varLeft.ullVal == varRight.ullVal ? VARCMP_EQ : varLeft.ullVal > varRight.ullVal ? VARCMP_GT : VARCMP_LT;
1029 default: return VarCmp(const_cast<LPVARIANT>(&varLeft), const_cast<LPVARIANT>(&varRight), lcid, dwFlags);
1030 }
1031 }
1033 };
1034 #pragma warning(pop)
1035
1039 class safearray : public dplhandle<SAFEARRAY*, NULL>
1040 {
1042
1043 public:
1049 virtual ~safearray()
1050 {
1051 if (m_h != invalid)
1052 free_internal();
1053 }
1054
1055 protected:
1061 void free_internal() noexcept override
1062 {
1063 SafeArrayDestroy(m_h);
1064 }
1065
1076 {
1077 handle_type h_new;
1078 HRESULT hr = SafeArrayCopy(h, &h_new);
1079 if (SUCCEEDED(hr))
1080 return h_new;
1081 throw com_runtime_error(hr, "SafeArrayCopy failed");
1082 }
1083 };
1084
1088 template <class T>
1090 {
1093
1094 public:
1100 safearray_accessor(_In_ SAFEARRAY* psa) : m_sa(psa)
1101 {
1102 HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&m_data);
1103 if (FAILED(hr))
1104 throw com_runtime_error(hr, "SafeArrayAccessData failed");
1105 }
1106
1113 {
1114 SafeArrayUnaccessData(m_sa);
1115 }
1116
1120 T HUGEP* data() const noexcept
1121 {
1122 return m_data;
1123 }
1124
1125 protected:
1126 SAFEARRAY* m_sa;
1127 T HUGEP* m_data;
1128 };
1129
1134 {
1137
1138 public:
1144 com_initializer(_In_opt_ LPVOID pvReserved) noexcept
1145 {
1146 m_result = CoInitialize(pvReserved);
1147 }
1148
1154 com_initializer(_In_opt_ LPVOID pvReserved, _In_ DWORD dwCoInit) noexcept
1155 {
1156 m_result = CoInitializeEx(pvReserved, dwCoInit);
1157 }
1158
1165 {
1166 if (SUCCEEDED(m_result))
1167 CoUninitialize();
1168 }
1169
1175 HRESULT status() const noexcept
1176 {
1177 return m_result;
1178 }
1179
1180 protected:
1181 HRESULT m_result;
1182 };
1183
1185}
1186
1189
1195template <class T>
1196static _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter, _In_ DWORD dwClsContext, _Inout_ winstd::com_obj<T> &v)
1197{
1198 T* ppv;
1199 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&ppv);
1200 if (SUCCEEDED(hr))
1201 v.attach(ppv);
1202 return hr;
1203}
1204
1210template <class T>
1211static _Check_return_ HRESULT CoGetObject(_In_ LPCWSTR pszName, _In_opt_ BIND_OPTS* pBindOptions, _In_ REFIID riid, _Inout_ winstd::com_obj<T>& v)
1212{
1213 T* ppv;
1214 HRESULT hr = CoGetObject(pszName, pBindOptions, riid, (LPVOID*)&ppv);
1215 if (SUCCEEDED(hr))
1216 v.attach(ppv);
1217 return hr;
1218}
1219
BSTR string wrapper.
Definition: COM.h:198
bstr(LPCOLESTR src)
Constructs BSTR from OLE string.
Definition: COM.h:205
bstr(const std::basic_string< wchar_t, _Traits, _Ax > &src)
Constructs BSTR from std::basic_string.
Definition: COM.h:226
handle_type duplicate_internal(handle_type h) const override
Duplicates the string.
Definition: COM.h:274
virtual ~bstr()
Destroys the string.
Definition: COM.h:238
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
bstr(LPCOLESTR src, UINT len)
Constructs BSTR from OLE string with length.
Definition: COM.h:215
Context scope automatic COM (un)initialization.
Definition: COM.h:1134
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:1154
com_initializer(LPVOID pvReserved) noexcept
Initializes the COM library on the current thread and identifies the concurrency model as single-thre...
Definition: COM.h:1144
HRESULT status() const noexcept
Return result of CoInitialize() call.
Definition: COM.h:1175
virtual ~com_initializer()
Uninitializes COM.
Definition: COM.h:1164
HRESULT m_result
Result of CoInitialize call.
Definition: COM.h:1181
COM object wrapper template.
Definition: COM.h:83
void free_internal() noexcept override
Releases the object by decrementing reference counter.
Definition: COM.h:173
com_obj(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext)
Creates a new instance of a class.
Definition: COM.h:92
HRESULT query_interface(_Other **h) const
Queries the object for another interface.
Definition: COM.h:144
handle_type duplicate_internal(handle_type h) const override
Duplicates the object by incrementing the reference counter.
Definition: COM.h:187
HRESULT query_interface(com_obj< _Other > &h) const
Queries the object for another interface.
Definition: COM.h:157
virtual ~com_obj()
Releases object.
Definition: COM.h:132
com_obj(_Other *other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:108
com_obj(com_obj< _Other > &other)
Queries the object for another interface and creates new class with it.
Definition: COM.h:122
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:900
T handle_type
Datatype of the object handle this template class handles.
Definition: Common.h:640
handle_type m_h
Object handle.
Definition: Common.h:889
Numerical runtime error.
Definition: Common.h:1029
HRESULT error_type
Error number type.
Definition: Common.h:1031
Context scope automatic SAFEARRAY (un)access.
Definition: COM.h:1090
safearray_accessor(SAFEARRAY *psa)
Increments the lock count of an array, and retrieves a pointer to the array data.
Definition: COM.h:1100
T HUGEP * data() const noexcept
Return SAFEARRAY data pointer.
Definition: COM.h:1120
SAFEARRAY * m_sa
SAFEARRAY.
Definition: COM.h:1126
virtual ~safearray_accessor()
Decrements the lock count of an array.
Definition: COM.h:1112
T HUGEP * m_data
SAFEARRAY data.
Definition: COM.h:1127
SAFEARRAY string wrapper.
Definition: COM.h:1040
virtual ~safearray()
Destroys the array.
Definition: COM.h:1049
handle_type duplicate_internal(handle_type h) const override
Duplicates the array.
Definition: COM.h:1075
void free_internal() noexcept override
Destroys the array.
Definition: COM.h:1061
VARIANT struct wrapper.
Definition: COM.h:289
bool operator<=(const VARIANT &varSrc) const noexcept
Is variant less than or equal to?
Definition: COM.h:992
variant(bool bSrc) noexcept
Constructs VARIANT from bool.
Definition: COM.h:323
variant & operator=(unsigned int nSrc) noexcept
Copy from unsigned int value.
Definition: COM.h:625
variant & operator=(unsigned long nSrc) noexcept
Copy from unsigned long value.
Definition: COM.h:651
variant(float fltSrc) noexcept
Constructs VARIANT from float.
Definition: COM.h:407
variant(VARIANT &&varSrc) noexcept
Moves VARIANT from another.
Definition: COM.h:314
variant & operator=(float fltSrc) noexcept
Copy from float value.
Definition: COM.h:691
variant & operator=(float *pfSrc) noexcept
Copy from float reference.
Definition: COM.h:885
variant(IDispatch *pSrc)
Constructs VARIANT from IDispatch.
Definition: COM.h:472
variant(int nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from integer.
Definition: COM.h:368
variant(const SAFEARRAY *pSrc)
Constructs VARIANT from SAFEARRAY.
Definition: COM.h:496
variant & operator=(double *pfSrc) noexcept
Copy from double reference.
Definition: COM.h:898
variant & operator=(const SAFEARRAY *pSrc)
Copy from SAFEARRAY.
Definition: COM.h:911
variant & operator=(int *pnSrc) noexcept
Copy from int reference.
Definition: COM.h:807
bool operator>(const VARIANT &varSrc) const noexcept
Is variant greater than?
Definition: COM.h:978
variant & operator=(bool bSrc) noexcept
Copy from bool value.
Definition: COM.h:547
variant & operator=(long nSrc) noexcept
Copy from long value.
Definition: COM.h:638
HRESULT change_type(VARTYPE _vt, USHORT wFlags=0) noexcept
Converts a variant from one type to another.
Definition: COM.h:1015
variant & operator=(IUnknown *pSrc)
Copy from IUnknown.
Definition: COM.h:755
variant & operator=(short nSrc) noexcept
Copy from short value.
Definition: COM.h:586
variant & operator=(unsigned char *pbSrc) noexcept
Copy from unsigned char reference.
Definition: COM.h:768
variant & operator=(unsigned short nSrc) noexcept
Copy from unsigned short value.
Definition: COM.h:599
variant & operator=(unsigned char nSrc) noexcept
Copy from unsigned char value.
Definition: COM.h:573
variant & operator=(char cSrc) noexcept
Copy from char value.
Definition: COM.h:560
variant(LPCOLESTR lpszSrc) noexcept
Constructs VARIANT from OLE string.
Definition: COM.h:454
virtual ~variant()
Destroys VARIANT.
Definition: COM.h:513
variant(const VARIANT &varSrc)
Constructs VARIANT from another.
Definition: COM.h:302
variant(unsigned char nSrc) noexcept
Constructs VARIANT from byte.
Definition: COM.h:341
variant & operator=(double dblSrc) noexcept
Copy from double value.
Definition: COM.h:704
bool operator!=(const VARIANT &varSrc) const noexcept
Is variant not equal to?
Definition: COM.h:951
variant & operator=(int nSrc) noexcept
Copy from int value.
Definition: COM.h:612
variant(unsigned long nSrc) noexcept
Constructs VARIANT from unsigned long.
Definition: COM.h:398
bool operator==(const VARIANT &varSrc) const noexcept
Is variant equal to?
Definition: COM.h:936
variant(IUnknown *pSrc)
Constructs VARIANT from IUnknown.
Definition: COM.h:484
variant(unsigned int nSrc, VARTYPE vtSrc=VT_UI4) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:378
variant & operator=(CY cySrc) noexcept
Copy from CY value.
Definition: COM.h:717
variant & operator=(LPCOLESTR lpszSrc) noexcept
Copy from OLE string value.
Definition: COM.h:731
variant(long long nSrc) noexcept
Constructs VARIANT from 64-bit integer.
Definition: COM.h:426
variant & operator=(unsigned int *pnSrc) noexcept
Copy from unsigned int reference.
Definition: COM.h:820
variant(long nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from long.
Definition: COM.h:388
variant & operator=(long *pnSrc) noexcept
Copy from long reference.
Definition: COM.h:833
variant(unsigned short nSrc) noexcept
Constructs VARIANT from unsigned short.
Definition: COM.h:359
bool operator>=(const VARIANT &varSrc) const noexcept
Is variant greater than or equal to?
Definition: COM.h:1005
variant & operator=(short *pnSrc) noexcept
Copy from short reference.
Definition: COM.h:781
variant() noexcept
Constructs blank VARIANT.
Definition: COM.h:294
bool operator<(const VARIANT &varSrc) const noexcept
Is variant less than?
Definition: COM.h:964
variant(unsigned long long nSrc) noexcept
Constructs VARIANT from unsigned integer.
Definition: COM.h:435
variant(char cSrc) noexcept
Constructs VARIANT from character.
Definition: COM.h:332
variant & operator=(unsigned short *pnSrc) noexcept
Copy from unsigned short reference.
Definition: COM.h:794
variant & operator=(long long *pnSrc) noexcept
Copy from long long reference.
Definition: COM.h:859
variant(BSTR bstr) noexcept
Constructs VARIANT from BSTR.
Definition: COM.h:463
variant & operator=(unsigned long long *pnSrc) noexcept
Copy from unsigned long long reference.
Definition: COM.h:872
variant(double dblSrc, VARTYPE vtSrc=VT_R8) noexcept
Constructs VARIANT from double or variant date.
Definition: COM.h:416
variant(short nSrc) noexcept
Constructs VARIANT from short.
Definition: COM.h:350
variant(CY cySrc) noexcept
Constructs VARIANT from CY (64-bit integer)
Definition: COM.h:444
variant & operator=(unsigned long long nSrc) noexcept
Copy from unsigned long long value.
Definition: COM.h:677
variant & operator=(VARIANT &&varSrc) noexcept
Moves from another VARIANT.
Definition: COM.h:534
variant & operator=(long long nSrc) noexcept
Copy from long long value.
Definition: COM.h:664
variant & operator=(IDispatch *pSrc)
Copy from IDispatch.
Definition: COM.h:742
variant & operator=(unsigned long *pnSrc) noexcept
Copy from unsigned long reference.
Definition: COM.h:846
variant & operator=(const VARIANT &varSrc)
Copy from another VARIANT.
Definition: COM.h:521
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:1211
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:1196
#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:645
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