From 0e4a5aa7a058d0fd42da29868889ab5131addca9 Mon Sep 17 00:00:00 2001 From: Lars Berger Date: Tue, 28 Jan 2025 18:08:21 +0000 Subject: [PATCH] fix: ensure COM interfaces are cleaned up on shutdown (#948) --- packages/wm-platform/src/com.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/wm-platform/src/com.rs b/packages/wm-platform/src/com.rs index 774cef11..666395dd 100644 --- a/packages/wm-platform/src/com.rs +++ b/packages/wm-platform/src/com.rs @@ -63,27 +63,27 @@ impl ComInit { } /// Returns an instance of `IServiceProvider`. - pub fn service_provider(&self) -> anyhow::Result { + pub fn service_provider(&self) -> anyhow::Result<&IServiceProvider> { self .service_provider - .clone() + .as_ref() .context("Unable to create `IServiceProvider` instance.") } /// Returns an instance of `IApplicationViewCollection`. pub fn application_view_collection( &self, - ) -> anyhow::Result { - self.application_view_collection.clone().context( + ) -> anyhow::Result<&IApplicationViewCollection> { + self.application_view_collection.as_ref().context( "Failed to query for `IApplicationViewCollection` instance.", ) } /// Returns an instance of `ITaskbarList2`. - pub fn taskbar_list(&self) -> anyhow::Result { + pub fn taskbar_list(&self) -> anyhow::Result<&ITaskbarList2> { self .taskbar_list - .clone() + .as_ref() .context("Unable to create `ITaskbarList2` instance.") } } @@ -96,6 +96,11 @@ impl Default for ComInit { impl Drop for ComInit { fn drop(&mut self) { + // Explicitly drop COM interfaces first. + drop(self.taskbar_list.take()); + drop(self.application_view_collection.take()); + drop(self.service_provider.take()); + unsafe { CoUninitialize() }; } }