From e7e900dd3fc4978d090b9ba88c3fa9134490969f Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Fri, 12 Jan 2024 10:33:10 -0600 Subject: [PATCH] retval --- crates/libs/bindgen/src/metadata.rs | 8 ++++++++ crates/samples/windows/shell/src/main.rs | 7 ++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/crates/libs/bindgen/src/metadata.rs b/crates/libs/bindgen/src/metadata.rs index b966e20494..ffe4b93e06 100644 --- a/crates/libs/bindgen/src/metadata.rs +++ b/crates/libs/bindgen/src/metadata.rs @@ -181,6 +181,14 @@ impl Signature { } fn is_retval(&self) -> bool { + // First we check whether there's an actual retval parameter. + if let Some(param) = self.params.last() { + if param.def.has_attribute("RetValAttribute") { + return true; + } + } + + // Then we see if we can infer retval-like behavior more conservatively. self.params.last().map_or(false, |param| param.is_retval()) && self.params[..self.params.len() - 1].iter().all(|param| { let flags = param.def.flags(); diff --git a/crates/samples/windows/shell/src/main.rs b/crates/samples/windows/shell/src/main.rs index 3e4287ef18..513e8d3ed8 100644 --- a/crates/samples/windows/shell/src/main.rs +++ b/crates/samples/windows/shell/src/main.rs @@ -42,20 +42,17 @@ fn shell_execute_from_explorer( fn find_desktop_folder_view() -> Result { unsafe { let windows: IShellWindows = CoCreateInstance(&ShellWindows, None, CLSCTX_ALL)?; - let mut dispatch = None; let mut handle = 0; - // TODO: find out why this retval isn't kicking in - windows.FindWindowSW( + let desktop = windows.FindWindowSW( &VARIANT::from(CSIDL_DESKTOP), &VARIANT::default(), SWC_DESKTOP, &mut handle, SWFO_NEEDDISPATCH, - &mut dispatch, )?; - let provider: IServiceProvider = dispatch.unwrap().cast()?; + let provider: IServiceProvider = desktop.cast()?; let browser: IShellBrowser = provider.QueryService(&SID_STopLevelBrowser)?; let view = browser.QueryActiveShellView()?; view.cast()