diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2023-04-22 16:06:07 +0200 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2023-04-22 17:45:40 +0200 |
commit | 8de1bf3674b5f5391ff1be229d99115107514877 (patch) | |
tree | bb0857cf844556380d2bf94b25e07878049b1f16 /include | |
parent | 31486f92f9ec0c2446ad96a4e8228a15797b23ba (diff) |
Introduce sal::systools::CoTaskMemAllocated to use RAII for CoTaskMemFree
Change-Id: I5553138bfc8dd989e68b8bcc2be981746e8c1e84
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150783
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/systools/win32/comtools.hxx | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/include/systools/win32/comtools.hxx b/include/systools/win32/comtools.hxx index b141842882aa..d54b1a22ce02 100644 --- a/include/systools/win32/comtools.hxx +++ b/include/systools/win32/comtools.hxx @@ -240,6 +240,25 @@ namespace sal::systools T* com_ptr_; }; + // A class to use with functions taking an out pointer argument, + // that needs to be freed with CoTaskMemFree - like SHGetKnownFolderPath + template <typename T> class CoTaskMemAllocated + { + public: + ~CoTaskMemAllocated() { CoTaskMemFree(m_pv); } + + T** operator&() + { + CoTaskMemFree(std::exchange(m_pv, nullptr)); + return &m_pv; + }; + + operator T*() { return m_pv; } + + private: + T* m_pv = nullptr; + }; + } // sal::systools /* Typedefs for some popular COM interfaces */ |