diff options
Diffstat (limited to 'common/comptr.h')
-rw-r--r-- | common/comptr.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/common/comptr.h b/common/comptr.h index 5a733ea2..9f8fd294 100644 --- a/common/comptr.h +++ b/common/comptr.h @@ -7,6 +7,44 @@ #include <utility> #include <variant> +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <objbase.h> + +struct ComWrapper { + HRESULT mStatus{}; + + ComWrapper(void *reserved, DWORD coinit) + : mStatus{CoInitializeEx(reserved, coinit)} + { } + ComWrapper(DWORD coinit=COINIT_APARTMENTTHREADED) + : mStatus{CoInitializeEx(nullptr, coinit)} + { } + ComWrapper(ComWrapper&& rhs) { mStatus = std::exchange(rhs.mStatus, E_FAIL); } + ComWrapper(const ComWrapper&) = delete; + ~ComWrapper() { if(SUCCEEDED(mStatus)) CoUninitialize(); } + + ComWrapper& operator=(ComWrapper&& rhs) + { + if(SUCCEEDED(mStatus)) + CoUninitialize(); + mStatus = std::exchange(rhs.mStatus, E_FAIL); + return *this; + } + ComWrapper& operator=(const ComWrapper&) = delete; + + HRESULT status() const noexcept { return mStatus; } + explicit operator bool() const noexcept { return SUCCEEDED(status()); } + + void uninit() + { + if(SUCCEEDED(mStatus)) + CoUninitialize(); + mStatus = E_FAIL; + } +}; + + template<typename T> struct ComPtr { using element_type = T; |