From 93762e20860659ed250f63235342f93420b6f129 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 28 Apr 2021 22:59:00 +0200 Subject: [PATCH] Generate QueryInterface-like helper function for callbacks --- crates/gen/src/types/callback.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/gen/src/types/callback.rs b/crates/gen/src/types/callback.rs index aa3b99de7f..f496833b4b 100644 --- a/crates/gen/src/types/callback.rs +++ b/crates/gen/src/types/callback.rs @@ -40,8 +40,24 @@ impl Callback { quote! {} }; + let query_interface_fn = if signature.has_query_interface() { + let constraints = signature.gen_constraints(&signature.params); + let leading_params = &signature.params[..signature.params.len() - 2]; + let params = signature.gen_win32_params(leading_params, gen); + let args = leading_params.iter().map(|p| p.gen_win32_abi_arg()); + quote! { + pub unsafe fn #name<#constraints T: ::windows::Interface>(func: &#name, #params) -> ::windows::Result { + let mut result__ = ::std::option::Option::None; + (func)(#(#args,)* &::IID, ::windows::Abi::set_abi(&mut result__)).and_some(result__) + } + } + } else { + quote!() + }; + quote! { pub type #name = unsafe extern "system" fn(#(#params),*) #return_type; + #query_interface_fn } } }