summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2023-04-22 16:06:07 +0200
committerMike Kaganski <mike.kaganski@collabora.com>2023-04-22 17:45:40 +0200
commit8de1bf3674b5f5391ff1be229d99115107514877 (patch)
treebb0857cf844556380d2bf94b25e07878049b1f16 /include
parent31486f92f9ec0c2446ad96a4e8228a15797b23ba (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.hxx19
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 */