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_opt_z_ LPCOLESTR src)
206 {
207 m_h = SysAllocString(src);
208 if (!m_h)
209 throw std::bad_alloc();
210 }
211
215 bstr(_In_reads_opt_(len) 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<OLECHAR, _Traits, _Ax> &src)
227 {
228 if (src.length() >= UINT_MAX)
229 throw std::invalid_argument("String too long");
230 m_h = SysAllocStringLen(src.c_str(), (UINT)src.length());
231 if (!m_h)
232 throw std::bad_alloc();
233 }
234
240 virtual ~bstr()
241 {
242 if (m_h != invalid)
244 }
245
251 UINT length() const noexcept
252 {
253 return SysStringLen(m_h);
254 }
255
256 protected:
262 void free_internal() noexcept override
263 {
264 SysFreeString(m_h);
265 }
266
277 {
278 handle_type h_new = SysAllocStringLen(h, SysStringLen(h));
279 if (h_new != invalid)
280 return h_new;
281 throw std::bad_alloc();
282 }
283 };
284
288 #pragma warning(push)
289 #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.
290 class variant : public VARIANT
291 {
292 public:
296 variant() noexcept
297 {
298 VariantInit(this);
299 }
300
304 variant(_In_ const VARIANT& varSrc)
305 {
306 vt = VT_EMPTY;
307 const HRESULT hr = VariantCopy(this, &varSrc);
308 if (FAILED(hr))
309 throw winstd::com_runtime_error(hr, "VariantCopy failed");
310 }
311
315 #pragma warning(suppress: 26495) // vt member is initialized as a result of memcpy()
316 variant(_Inout_ VARIANT&& varSrc) noexcept
317 {
318 memcpy(this, &varSrc, sizeof(VARIANT));
319 varSrc.vt = VT_EMPTY;
320 }
321
325 variant(_In_ bool bSrc) noexcept
326 {
327 vt = VT_BOOL;
328 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
329 }
330
334 variant(_In_ char cSrc) noexcept
335 {
336 vt = VT_I1;
337 cVal = cSrc;
338 }
339
343 variant(_In_ unsigned char nSrc) noexcept
344 {
345 vt = VT_UI1;
346 bVal = nSrc;
347 }
348
352 variant(_In_ short nSrc) noexcept
353 {
354 vt = VT_I2;
355 iVal = nSrc;
356 }
357
361 variant(_In_ unsigned short nSrc) noexcept
362 {
363 vt = VT_UI2;
364 uiVal = nSrc;
365 }
366
370 variant(_In_ int nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
371 {
372 assert(vtSrc == VT_I4 || vtSrc == VT_INT);
373 vt = vtSrc;
374 intVal = nSrc;
375 }
376
380 variant(_In_ unsigned int nSrc, _In_ VARTYPE vtSrc = VT_UI4) noexcept
381 {
382 assert(vtSrc == VT_UI4 || vtSrc == VT_UINT);
383 vt = vtSrc;
384 uintVal= nSrc;
385 }
386
390 variant(_In_ long nSrc, _In_ VARTYPE vtSrc = VT_I4) noexcept
391 {
392 assert(vtSrc == VT_I4 || vtSrc == VT_ERROR);
393 vt = vtSrc;
394 lVal = nSrc;
395 }
396
400 variant(_In_ unsigned long nSrc) noexcept
401 {
402 vt = VT_UI4;
403 ulVal = nSrc;
404 }
405
409 variant(_In_ float fltSrc) noexcept
410 {
411 vt = VT_R4;
412 fltVal = fltSrc;
413 }
414
418 variant(_In_ double dblSrc, _In_ VARTYPE vtSrc = VT_R8) noexcept
419 {
420 assert(vtSrc == VT_R8 || vtSrc == VT_DATE);
421 vt = vtSrc;
422 dblVal = dblSrc;
423 }
424
428 variant(_In_ long long nSrc) noexcept
429 {
430 vt = VT_I8;
431 llVal = nSrc;
432 }
433
437 variant(_In_ unsigned long long nSrc) noexcept
438 {
439 vt = VT_UI8;
440 ullVal = nSrc;
441 }
442
446 variant(_In_ CY cySrc) noexcept
447 {
448 vt = VT_CY;
449 cyVal.Hi = cySrc.Hi;
450 cyVal.Lo = cySrc.Lo;
451 }
452
456 variant(_In_z_ LPCOLESTR lpszSrc) noexcept
457 {
458 vt = VT_EMPTY;
459 *this = lpszSrc;
460 }
461
465 variant(_In_z_ BSTR bstr) noexcept
466 {
467 vt = VT_EMPTY;
468 *this = bstr;
469 }
470
474 variant(_In_opt_ IDispatch* pSrc)
475 {
476 vt = VT_DISPATCH;
477 pdispVal = pSrc;
478
479 if (pdispVal != NULL)
480 pdispVal->AddRef();
481 }
482
486 variant(_In_opt_ IUnknown* pSrc)
487 {
488 vt = VT_UNKNOWN;
489 punkVal = pSrc;
490
491 if (punkVal != NULL)
492 punkVal->AddRef();
493 }
494
498 variant(_In_ const SAFEARRAY *pSrc)
499 {
500 assert(pSrc != NULL);
501
502 LPSAFEARRAY pCopy;
503 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
504 if (FAILED(hr))
505 throw winstd::com_runtime_error(hr, "SafeArrayCopy failed");
506
507 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
508 vt |= VT_ARRAY;
509 parray = pCopy;
510 }
511
515 virtual ~variant()
516 {
517 VariantClear(this);
518 }
519
523 variant& operator=(_In_ const VARIANT& varSrc)
524 {
525 if (this != &varSrc) {
526 const HRESULT hr = VariantCopy(this, &varSrc);
527 if (FAILED(hr))
528 throw winstd::com_runtime_error(hr, "VariantCopy failed");
529 }
530 return *this;
531 }
532
536 variant& operator=(_Inout_ VARIANT&& varSrc) noexcept
537 {
538 if (this != &varSrc) {
539 VariantClear(this);
540 memcpy(this, &varSrc, sizeof(VARIANT));
541 varSrc.vt = VT_EMPTY;
542 }
543 return *this;
544 }
545
549 variant& operator=(_In_ bool bSrc) noexcept
550 {
551 if (vt != VT_BOOL) {
552 VariantClear(this);
553 vt = VT_BOOL;
554 }
555 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
556 return *this;
557 }
558
562 variant& operator=(_In_ char cSrc) noexcept
563 {
564 if (vt != VT_I1) {
565 VariantClear(this);
566 vt = VT_I1;
567 }
568 cVal = cSrc;
569 return *this;
570 }
571
575 variant& operator=(_In_ unsigned char nSrc) noexcept
576 {
577 if (vt != VT_UI1) {
578 VariantClear(this);
579 vt = VT_UI1;
580 }
581 bVal = nSrc;
582 return *this;
583 }
584
588 variant& operator=(_In_ short nSrc) noexcept
589 {
590 if (vt != VT_I2) {
591 VariantClear(this);
592 vt = VT_I2;
593 }
594 iVal = nSrc;
595 return *this;
596 }
597
601 variant& operator=(_In_ unsigned short nSrc) noexcept
602 {
603 if (vt != VT_UI2) {
604 VariantClear(this);
605 vt = VT_UI2;
606 }
607 uiVal = nSrc;
608 return *this;
609 }
610
614 variant& operator=(_In_ int nSrc) noexcept
615 {
616 if (vt != VT_I4) {
617 VariantClear(this);
618 vt = VT_I4;
619 }
620 intVal = nSrc;
621 return *this;
622 }
623
627 variant& operator=(_In_ unsigned int nSrc) noexcept
628 {
629 if (vt != VT_UI4) {
630 VariantClear(this);
631 vt = VT_UI4;
632 }
633 uintVal= nSrc;
634 return *this;
635 }
636
640 variant& operator=(_In_ long nSrc) noexcept
641 {
642 if (vt != VT_I4) {
643 VariantClear(this);
644 vt = VT_I4;
645 }
646 lVal = nSrc;
647 return *this;
648 }
649
653 variant& operator=(_In_ unsigned long nSrc) noexcept
654 {
655 if (vt != VT_UI4) {
656 VariantClear(this);
657 vt = VT_UI4;
658 }
659 ulVal = nSrc;
660 return *this;
661 }
662
666 variant& operator=(_In_ long long nSrc) noexcept
667 {
668 if (vt != VT_I8) {
669 VariantClear(this);
670 vt = VT_I8;
671 }
672 llVal = nSrc;
673 return *this;
674 }
675
679 variant& operator=(_In_ unsigned long long nSrc) noexcept
680 {
681 if (vt != VT_UI8) {
682 VariantClear(this);
683 vt = VT_UI8;
684 }
685 ullVal = nSrc;
686
687 return *this;
688 }
689
693 variant& operator=(_In_ float fltSrc) noexcept
694 {
695 if (vt != VT_R4) {
696 VariantClear(this);
697 vt = VT_R4;
698 }
699 fltVal = fltSrc;
700 return *this;
701 }
702
706 variant& operator=(_In_ double dblSrc) noexcept
707 {
708 if (vt != VT_R8) {
709 VariantClear(this);
710 vt = VT_R8;
711 }
712 dblVal = dblSrc;
713 return *this;
714 }
715
719 variant& operator=(_In_ CY cySrc) noexcept
720 {
721 if (vt != VT_CY) {
722 VariantClear(this);
723 vt = VT_CY;
724 }
725 cyVal.Hi = cySrc.Hi;
726 cyVal.Lo = cySrc.Lo;
727 return *this;
728 }
729
733 variant& operator=(_In_z_ LPCOLESTR lpszSrc) noexcept
734 {
735 VariantClear(this);
736 vt = VT_BSTR;
737 bstrVal = SysAllocString(lpszSrc);
738 return *this;
739 }
740
744 variant& operator=(_Inout_opt_ IDispatch* pSrc)
745 {
746 VariantClear(this);
747 vt = VT_DISPATCH;
748 pdispVal = pSrc;
749 if (pdispVal != NULL)
750 pdispVal->AddRef();
751 return *this;
752 }
753
757 variant& operator=(_Inout_opt_ IUnknown* pSrc)
758 {
759 VariantClear(this);
760 vt = VT_UNKNOWN;
761 punkVal = pSrc;
762 if (punkVal != NULL)
763 punkVal->AddRef();
764 return *this;
765 }
766
770 variant& operator=(_In_ unsigned char* pbSrc) noexcept
771 {
772 if (vt != (VT_UI1|VT_BYREF)) {
773 VariantClear(this);
774 vt = VT_UI1|VT_BYREF;
775 }
776 pbVal = pbSrc;
777 return *this;
778 }
779
783 variant& operator=(_In_ short* pnSrc) noexcept
784 {
785 if (vt != (VT_I2|VT_BYREF)) {
786 VariantClear(this);
787 vt = VT_I2|VT_BYREF;
788 }
789 piVal = pnSrc;
790 return *this;
791 }
792
796 variant& operator=(_In_ unsigned short* pnSrc) noexcept
797 {
798 if (vt != (VT_UI2|VT_BYREF)) {
799 VariantClear(this);
800 vt = VT_UI2|VT_BYREF;
801 }
802 puiVal = pnSrc;
803 return *this;
804 }
805
809 variant& operator=(_In_ int* pnSrc) noexcept
810 {
811 if (vt != (VT_I4|VT_BYREF)) {
812 VariantClear(this);
813 vt = VT_I4|VT_BYREF;
814 }
815 pintVal = pnSrc;
816 return *this;
817 }
818
822 variant& operator=(_In_ unsigned int* pnSrc) noexcept
823 {
824 if (vt != (VT_UI4|VT_BYREF)) {
825 VariantClear(this);
826 vt = VT_UI4|VT_BYREF;
827 }
828 puintVal = pnSrc;
829 return *this;
830 }
831
835 variant& operator=(_In_ long* pnSrc) noexcept
836 {
837 if (vt != (VT_I4|VT_BYREF)) {
838 VariantClear(this);
839 vt = VT_I4|VT_BYREF;
840 }
841 plVal = pnSrc;
842 return *this;
843 }
844
848 variant& operator=(_In_ unsigned long* pnSrc) noexcept
849 {
850 if (vt != (VT_UI4|VT_BYREF)) {
851 VariantClear(this);
852 vt = VT_UI4|VT_BYREF;
853 }
854 pulVal = pnSrc;
855 return *this;
856 }
857
861 variant& operator=(_In_ long long* pnSrc) noexcept
862 {
863 if (vt != (VT_I8|VT_BYREF)) {
864 VariantClear(this);
865 vt = VT_I8|VT_BYREF;
866 }
867 pllVal = pnSrc;
868 return *this;
869 }
870
874 variant& operator=(_In_ unsigned long long* pnSrc) noexcept
875 {
876 if (vt != (VT_UI8|VT_BYREF)) {
877 VariantClear(this);
878 vt = VT_UI8|VT_BYREF;
879 }
880 pullVal = pnSrc;
881 return *this;
882 }
883
887 variant& operator=(_In_ float* pfSrc) noexcept
888 {
889 if (vt != (VT_R4|VT_BYREF)) {
890 VariantClear(this);
891 vt = VT_R4|VT_BYREF;
892 }
893 pfltVal = pfSrc;
894 return *this;
895 }
896
900 variant& operator=(_In_ double* pfSrc) noexcept
901 {
902 if (vt != (VT_R8|VT_BYREF)) {
903 VariantClear(this);
904 vt = VT_R8|VT_BYREF;
905 }
906 pdblVal = pfSrc;
907 return *this;
908 }
909
913 variant& operator=(_In_ const SAFEARRAY *pSrc)
914 {
915 assert(pSrc != NULL);
916 VariantClear(this);
917
918 LPSAFEARRAY pCopy;
919 const HRESULT hr = SafeArrayCopy(const_cast<LPSAFEARRAY>(pSrc), &pCopy);
920 if (SUCCEEDED(hr)) {
921 SafeArrayGetVartype(const_cast<LPSAFEARRAY>(pSrc), &vt);
922 vt |= VT_ARRAY;
923 parray = pCopy;
924 return *this;
925 }
926 throw com_runtime_error(hr, "SafeArrayCopy failed");
927 }
928
929 public:
938 bool operator==(_In_ const VARIANT& varSrc) const noexcept
939 {
940 if (vt == VT_NULL && varSrc.vt == VT_NULL) return true;
941 if (vt != varSrc.vt) return false;
942 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0) == static_cast<HRESULT>(VARCMP_EQ);
943 }
944
953 bool operator!=(_In_ const VARIANT& varSrc) const noexcept
954 {
955 return !operator==(varSrc);
956 }
957
966 bool operator<(_In_ const VARIANT& varSrc) const noexcept
967 {
968 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
969 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_LT);
970 }
971
980 bool operator>(_In_ const VARIANT& varSrc) const noexcept
981 {
982 if (vt == VT_NULL && varSrc.vt == VT_NULL) return false;
983 return compare(static_cast<const VARIANT&>(*this), varSrc, LOCALE_USER_DEFAULT, 0)== static_cast<HRESULT>(VARCMP_GT);
984 }
985
994 bool operator<=(_In_ const VARIANT& varSrc) const noexcept
995 {
996 return !operator>(varSrc);
997 }
998
1007 bool operator>=(_In_ const VARIANT& varSrc) const noexcept
1008 {
1009 return !operator<(varSrc);
1010 }
1011
1017 HRESULT change_type(_In_ VARTYPE _vt, _In_opt_ USHORT wFlags = 0) noexcept
1018 {
1019 return VariantChangeType(this, this, wFlags, _vt);
1020 }
1021
1022 private:
1024 HRESULT compare(_In_ const VARIANT &varLeft, _In_ const VARIANT &varRight, _In_ LCID lcid, _In_ ULONG dwFlags) const noexcept
1025 {
1026 switch(vt) {
1027 case VT_I1: return varLeft.cVal == varRight.cVal ? VARCMP_EQ : varLeft.cVal > varRight.cVal ? VARCMP_GT : VARCMP_LT;
1028 case VT_UI2: return varLeft.uiVal == varRight.uiVal ? VARCMP_EQ : varLeft.uiVal > varRight.uiVal ? VARCMP_GT : VARCMP_LT;
1029 case VT_UI4: return varLeft.uintVal == varRight.uintVal ? VARCMP_EQ : varLeft.uintVal > varRight.uintVal ? VARCMP_GT : VARCMP_LT;
1030 case VT_UI8: return varLeft.ullVal == varRight.ullVal ? VARCMP_EQ : varLeft.ullVal > varRight.ullVal ? VARCMP_GT : VARCMP_LT;
1031 default: return VarCmp(const_cast<LPVARIANT>(&varLeft), const_cast<LPVARIANT>(&varRight), lcid, dwFlags);
1032 }
1033 }
1035 };
1036 #pragma warning(pop)
1037
1041 class safearray : public dplhandle<SAFEARRAY*, NULL>
1042 {
1044
1045 public:
1051 virtual ~safearray()
1052 {
1053 if (m_h != invalid)
1054 free_internal();
1055 }
1056
1057 protected:
1063 void free_internal() noexcept override
1064 {
1065 SafeArrayDestroy(m_h);
1066 }
1067
1078 {
1079 handle_type h_new;
1080 HRESULT hr = SafeArrayCopy(h, &h_new);
1081 if (SUCCEEDED(hr))
1082 return h_new;
1083 throw com_runtime_error(hr, "SafeArrayCopy failed");
1084 }
1085 };
1086
1090 template <class T>
1092 {
1095
1096 public:
1102 safearray_accessor(_In_ SAFEARRAY* psa) : m_sa(psa)
1103 {
1104 HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&m_data);
1105 if (FAILED(hr))
1106 throw com_runtime_error(hr, "SafeArrayAccessData failed");
1107 }
1108
1115 {
1116 SafeArrayUnaccessData(m_sa);
1117 }
1118
1122 T HUGEP* data() const noexcept
1123 {
1124 return m_data;
1125 }
1126
1127 protected:
1128 SAFEARRAY* m_sa;
1129 T HUGEP* m_data;
1130 };
1131
1136 {
1139
1140 public:
1146 com_initializer(_In_opt_ LPVOID pvReserved) noexcept
1147 {
1148 m_result = CoInitialize(pvReserved);
1149 }
1150
1156 com_initializer(_In_opt_ LPVOID pvReserved, _In_ DWORD dwCoInit) noexcept
1157 {
1158 m_result = CoInitializeEx(pvReserved, dwCoInit);
1159 }
1160
1167 {
1168 if (SUCCEEDED(m_result))
1169 CoUninitialize();
1170 }
1171
1177 HRESULT status() const noexcept
1178 {
1179 return m_result;
1180 }
1181
1182 protected:
1183 HRESULT m_result;
1184 };
1185
1187}
1188
1191
1197template <class T>
1198static _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter, _In_ DWORD dwClsContext, _Inout_ winstd::com_obj<T> &v)
1199{
1200 T* ppv;
1201 HRESULT hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (LPVOID*)&ppv);
1202 if (SUCCEEDED(hr))
1203 v.attach(ppv);
1204 return hr;
1205}
1206
1212template <class T>
1213static _Check_return_ HRESULT CoGetObject(_In_ LPCWSTR pszName, _In_opt_ BIND_OPTS* pBindOptions, _In_ REFIID riid, _Inout_ winstd::com_obj<T>& v)
1214{
1215 T* ppv;
1216 HRESULT hr = CoGetObject(pszName, pBindOptions, riid, (LPVOID*)&ppv);
1217 if (SUCCEEDED(hr))
1218 v.attach(ppv);
1219 return hr;
1220}
1221
BSTR string wrapper.
Definition COM.h:198
bstr(LPCOLESTR src)
Constructs BSTR from OLE string.
Definition COM.h:205
handle_type duplicate_internal(handle_type h) const override
Duplicates the string.
Definition COM.h:276
virtual ~bstr()
Destroys the string.
Definition COM.h:240
void free_internal() noexcept override
Destroys the string.
Definition COM.h:262
UINT length() const noexcept
Returns the length of the string.
Definition COM.h:251
bstr(LPCOLESTR src, UINT len)
Constructs BSTR from OLE string with length.
Definition COM.h:215
bstr(const std::basic_string< OLECHAR, _Traits, _Ax > &src)
Constructs BSTR from std::basic_string.
Definition COM.h:226
Context scope automatic COM (un)initialization.
Definition COM.h:1136
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:1156
com_initializer(LPVOID pvReserved) noexcept
Initializes the COM library on the current thread and identifies the concurrency model as single-thre...
Definition COM.h:1146
HRESULT status() const noexcept
Return result of CoInitialize() call.
Definition COM.h:1177
virtual ~com_initializer()
Uninitializes COM.
Definition COM.h:1166
HRESULT m_result
Result of CoInitialize call.
Definition COM.h:1183
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:1248
T handle_type
Datatype of the object handle this template class handles.
Definition Common.h:988
handle_type m_h
Object handle.
Definition Common.h:1237
Numerical runtime error.
Definition Common.h:1377
HRESULT error_type
Error number type.
Definition Common.h:1379
Context scope automatic SAFEARRAY (un)access.
Definition COM.h:1092
safearray_accessor(SAFEARRAY *psa)
Increments the lock count of an array, and retrieves a pointer to the array data.
Definition COM.h:1102
T HUGEP * data() const noexcept
Return SAFEARRAY data pointer.
Definition COM.h:1122
SAFEARRAY * m_sa
SAFEARRAY.
Definition COM.h:1128
virtual ~safearray_accessor()
Decrements the lock count of an array.
Definition COM.h:1114
T HUGEP * m_data
SAFEARRAY data.
Definition COM.h:1129
SAFEARRAY string wrapper.
Definition COM.h:1042
virtual ~safearray()
Destroys the array.
Definition COM.h:1051
handle_type duplicate_internal(handle_type h) const override
Duplicates the array.
Definition COM.h:1077
void free_internal() noexcept override
Destroys the array.
Definition COM.h:1063
VARIANT struct wrapper.
Definition COM.h:291
bool operator<=(const VARIANT &varSrc) const noexcept
Is variant less than or equal to?
Definition COM.h:994
variant(bool bSrc) noexcept
Constructs VARIANT from bool.
Definition COM.h:325
variant & operator=(unsigned int nSrc) noexcept
Copy from unsigned int value.
Definition COM.h:627
variant & operator=(unsigned long nSrc) noexcept
Copy from unsigned long value.
Definition COM.h:653
variant(float fltSrc) noexcept
Constructs VARIANT from float.
Definition COM.h:409
variant(VARIANT &&varSrc) noexcept
Moves VARIANT from another.
Definition COM.h:316
variant & operator=(float fltSrc) noexcept
Copy from float value.
Definition COM.h:693
variant & operator=(float *pfSrc) noexcept
Copy from float reference.
Definition COM.h:887
variant(IDispatch *pSrc)
Constructs VARIANT from IDispatch.
Definition COM.h:474
variant(int nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from integer.
Definition COM.h:370
variant(const SAFEARRAY *pSrc)
Constructs VARIANT from SAFEARRAY.
Definition COM.h:498
variant & operator=(double *pfSrc) noexcept
Copy from double reference.
Definition COM.h:900
variant & operator=(const SAFEARRAY *pSrc)
Copy from SAFEARRAY.
Definition COM.h:913
variant & operator=(int *pnSrc) noexcept
Copy from int reference.
Definition COM.h:809
bool operator>(const VARIANT &varSrc) const noexcept
Is variant greater than?
Definition COM.h:980
variant & operator=(bool bSrc) noexcept
Copy from bool value.
Definition COM.h:549
variant & operator=(long nSrc) noexcept
Copy from long value.
Definition COM.h:640
HRESULT change_type(VARTYPE _vt, USHORT wFlags=0) noexcept
Converts a variant from one type to another.
Definition COM.h:1017
variant & operator=(IUnknown *pSrc)
Copy from IUnknown.
Definition COM.h:757
variant & operator=(short nSrc) noexcept
Copy from short value.
Definition COM.h:588
variant & operator=(unsigned char *pbSrc) noexcept
Copy from unsigned char reference.
Definition COM.h:770
variant & operator=(unsigned short nSrc) noexcept
Copy from unsigned short value.
Definition COM.h:601
variant & operator=(unsigned char nSrc) noexcept
Copy from unsigned char value.
Definition COM.h:575
variant & operator=(char cSrc) noexcept
Copy from char value.
Definition COM.h:562
variant(LPCOLESTR lpszSrc) noexcept
Constructs VARIANT from OLE string.
Definition COM.h:456
virtual ~variant()
Destroys VARIANT.
Definition COM.h:515
variant(const VARIANT &varSrc)
Constructs VARIANT from another.
Definition COM.h:304
variant(unsigned char nSrc) noexcept
Constructs VARIANT from byte.
Definition COM.h:343
variant & operator=(double dblSrc) noexcept
Copy from double value.
Definition COM.h:706
bool operator!=(const VARIANT &varSrc) const noexcept
Is variant not equal to?
Definition COM.h:953
variant & operator=(int nSrc) noexcept
Copy from int value.
Definition COM.h:614
variant(unsigned long nSrc) noexcept
Constructs VARIANT from unsigned long.
Definition COM.h:400
bool operator==(const VARIANT &varSrc) const noexcept
Is variant equal to?
Definition COM.h:938
variant(IUnknown *pSrc)
Constructs VARIANT from IUnknown.
Definition COM.h:486
variant(unsigned int nSrc, VARTYPE vtSrc=VT_UI4) noexcept
Constructs VARIANT from unsigned integer.
Definition COM.h:380
variant & operator=(CY cySrc) noexcept
Copy from CY value.
Definition COM.h:719
variant & operator=(LPCOLESTR lpszSrc) noexcept
Copy from OLE string value.
Definition COM.h:733
variant(long long nSrc) noexcept
Constructs VARIANT from 64-bit integer.
Definition COM.h:428
variant & operator=(unsigned int *pnSrc) noexcept
Copy from unsigned int reference.
Definition COM.h:822
variant(long nSrc, VARTYPE vtSrc=VT_I4) noexcept
Constructs VARIANT from long.
Definition COM.h:390
variant & operator=(long *pnSrc) noexcept
Copy from long reference.
Definition COM.h:835
variant(unsigned short nSrc) noexcept
Constructs VARIANT from unsigned short.
Definition COM.h:361
bool operator>=(const VARIANT &varSrc) const noexcept
Is variant greater than or equal to?
Definition COM.h:1007
variant & operator=(short *pnSrc) noexcept
Copy from short reference.
Definition COM.h:783
variant() noexcept
Constructs blank VARIANT.
Definition COM.h:296
bool operator<(const VARIANT &varSrc) const noexcept
Is variant less than?
Definition COM.h:966
variant(unsigned long long nSrc) noexcept
Constructs VARIANT from unsigned integer.
Definition COM.h:437
variant(char cSrc) noexcept
Constructs VARIANT from character.
Definition COM.h:334
variant & operator=(unsigned short *pnSrc) noexcept
Copy from unsigned short reference.
Definition COM.h:796
variant & operator=(long long *pnSrc) noexcept
Copy from long long reference.
Definition COM.h:861
variant(BSTR bstr) noexcept
Constructs VARIANT from BSTR.
Definition COM.h:465
variant & operator=(unsigned long long *pnSrc) noexcept
Copy from unsigned long long reference.
Definition COM.h:874
variant(double dblSrc, VARTYPE vtSrc=VT_R8) noexcept
Constructs VARIANT from double or variant date.
Definition COM.h:418
variant(short nSrc) noexcept
Constructs VARIANT from short.
Definition COM.h:352
variant(CY cySrc) noexcept
Constructs VARIANT from CY (64-bit integer)
Definition COM.h:446
variant & operator=(unsigned long long nSrc) noexcept
Copy from unsigned long long value.
Definition COM.h:679
variant & operator=(VARIANT &&varSrc) noexcept
Moves from another VARIANT.
Definition COM.h:536
variant & operator=(long long nSrc) noexcept
Copy from long long value.
Definition COM.h:666
variant & operator=(IDispatch *pSrc)
Copy from IDispatch.
Definition COM.h:744
variant & operator=(unsigned long *pnSrc) noexcept
Copy from unsigned long reference.
Definition COM.h:848
variant & operator=(const VARIANT &varSrc)
Copy from another VARIANT.
Definition COM.h:523
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:1213
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:1198
#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:993
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