From 8de1bf3674b5f5391ff1be229d99115107514877 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sat, 22 Apr 2023 16:06:07 +0200 Subject: 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 --- include/systools/win32/comtools.hxx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'include') 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 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 */ -- cgit