diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c129c9deef..12ac16d73d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -163,6 +163,7 @@ jobs: cargo clippy -p test_ntstatus && cargo clippy -p test_null_result && cargo clippy -p test_properties && + cargo clippy -p test_query_signature && cargo clippy -p test_return_struct && cargo clippy -p test_string_param && cargo clippy -p test_structs && diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2b743d6d39..16699a7e98 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -125,8 +125,8 @@ jobs: cargo test --target ${{ matrix.target }} -p test_component && cargo test --target ${{ matrix.target }} -p test_component_client && cargo test --target ${{ matrix.target }} -p test_const_fields && - cargo clean && cargo test --target ${{ matrix.target }} -p test_core && + cargo clean && cargo test --target ${{ matrix.target }} -p test_data_object && cargo test --target ${{ matrix.target }} -p test_debug && cargo test --target ${{ matrix.target }} -p test_deprecated && @@ -152,6 +152,7 @@ jobs: cargo test --target ${{ matrix.target }} -p test_ntstatus && cargo test --target ${{ matrix.target }} -p test_null_result && cargo test --target ${{ matrix.target }} -p test_properties && + cargo test --target ${{ matrix.target }} -p test_query_signature && cargo test --target ${{ matrix.target }} -p test_return_struct && cargo test --target ${{ matrix.target }} -p test_string_param && cargo test --target ${{ matrix.target }} -p test_structs && diff --git a/crates/libs/bindgen/src/com_methods.rs b/crates/libs/bindgen/src/com_methods.rs index 7f48208180..7504ff14bc 100644 --- a/crates/libs/bindgen/src/com_methods.rs +++ b/crates/libs/bindgen/src/com_methods.rs @@ -20,38 +20,37 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth bases.combine("e! { .base__ }); } - match gen.reader.signature_kind(&signature) { - SignatureKind::Query => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let kind = gen.reader.signature_kind(&signature); + match kind { + SignatureKind::Query(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc #features pub unsafe fn #name<#constraints T: ::windows::core::Interface>(&self, #params) -> ::windows::core::Result { let mut result__ = ::core::option::Option::None; - (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args &::IID, &mut result__ as *mut _ as *mut _).and_some(result__) + (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args).and_some(result__) } } } - SignatureKind::QueryOptional => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + SignatureKind::QueryOptional(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc #features pub unsafe fn #name<#constraints T: ::windows::core::Interface>(&self, #params result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args &::IID, result__ as *mut _ as *mut _).ok() + (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args).ok() } } } SignatureKind::ResultValue => { let leading_params = &signature.params[..signature.params.len() - 1]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let args = gen.win32_args(leading_params, kind); + let params = gen.win32_params(leading_params, kind); let return_type = signature.params[signature.params.len() - 1].ty.deref(); let return_type_tokens = gen.type_name(&return_type); let abi_return_type_tokens = gen.type_abi_name(&return_type); @@ -67,8 +66,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::ResultVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -79,8 +78,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::ReturnStruct => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let return_type = gen.type_name(&signature.return_type.unwrap()); quote! { @@ -94,8 +93,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::PreserveSig => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let return_type = gen.return_sig(&signature); quote! { @@ -107,8 +106,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::ReturnVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -139,7 +138,7 @@ pub fn gen_upcall(gen: &Gen, sig: &Signature, inner: TokenStream) -> TokenStream } } } - SignatureKind::Query | SignatureKind::QueryOptional | SignatureKind::ResultVoid => { + SignatureKind::Query(_) | SignatureKind::QueryOptional(_) | SignatureKind::ResultVoid => { let invoke_args = sig.params.iter().map(|param| gen_win32_invoke_arg(gen, param)); quote! { diff --git a/crates/libs/bindgen/src/functions.rs b/crates/libs/bindgen/src/functions.rs index 1d736bd8a1..3ea4d2cdbb 100644 --- a/crates/libs/bindgen/src/functions.rs +++ b/crates/libs/bindgen/src/functions.rs @@ -64,11 +64,11 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { let doc = gen.cfg_doc(&cfg); let features = gen.cfg_features(&cfg); - match gen.reader.signature_kind(&signature) { - SignatureKind::Query => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let kind = gen.reader.signature_kind(&signature); + match kind { + SignatureKind::Query(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -82,17 +82,16 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { fn #name(#(#abi_params),*) #abi_return_type; } let mut result__ = ::core::option::Option::None; - #name(#args &::IID, &mut result__ as *mut _ as *mut _).and_some(result__) + #name(#args).and_some(result__) } #[cfg(not(windows))] unimplemented!("Unsupported target OS"); } } } - SignatureKind::QueryOptional => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + SignatureKind::QueryOptional(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -105,7 +104,7 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { extern "system" { fn #name(#(#abi_params),*) #abi_return_type; } - #name(#args &::IID, result__ as *mut _ as *mut _).ok() + #name(#args).ok() } #[cfg(not(windows))] unimplemented!("Unsupported target OS"); @@ -114,8 +113,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } SignatureKind::ResultValue => { let leading_params = &signature.params[..signature.params.len() - 1]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let args = gen.win32_args(leading_params, kind); + let params = gen.win32_params(leading_params, kind); let return_type = signature.params[signature.params.len() - 1].ty.deref(); let return_type_tokens = gen.type_name(&return_type); let abi_return_type_tokens = gen.type_abi_name(&return_type); @@ -140,8 +139,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } } SignatureKind::ResultVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -163,8 +162,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } SignatureKind::ReturnStruct | SignatureKind::PreserveSig => { if handle_last_error(gen, def, &signature) { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let return_type = gen.type_name(&signature.return_type.unwrap()); quote! { @@ -186,8 +185,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } } } else { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -209,8 +208,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } } SignatureKind::ReturnVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let does_not_return = does_not_return(gen, def); quote! { diff --git a/crates/libs/bindgen/src/gen.rs b/crates/libs/bindgen/src/gen.rs index a541bdb3e2..f4e6e4b3f8 100644 --- a/crates/libs/bindgen/src/gen.rs +++ b/crates/libs/bindgen/src/gen.rs @@ -834,56 +834,73 @@ impl<'a> Gen<'a> { quote! {} } } - pub fn win32_args(&self, params: &[SignatureParam]) -> TokenStream { + pub fn win32_args(&self, params: &[SignatureParam], kind: SignatureKind) -> TokenStream { let mut tokens = quote! {}; - for param in params { - let name = self.param_name(param.def); - - if let ArrayInfo::Fixed(fixed) = param.array_info { - if fixed > 0 && self.reader.param_free_with(param.def).is_none() { - let signature = if self.reader.param_flags(param.def).output() { - quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } - } else { - quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } - }; - - tokens.combine(&signature); - continue; + for (position, param) in params.iter().enumerate() { + match kind { + SignatureKind::Query(query) if query.object == position => { + tokens.combine("e! { &mut result__ as *mut _ as *mut _, }); } - } - - if let ArrayInfo::RelativeLen(_) = param.array_info { - let signature = if self.reader.param_flags(param.def).output() { - quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } - } else { - quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } - }; - - tokens.combine(&signature); - continue; - } - - if let ArrayInfo::RelativePtr(relative) = param.array_info { - let name = self.param_name(params[relative].def); - tokens.combine("e! { #name.len() as _, }); - continue; - } + SignatureKind::QueryOptional(query) if query.object == position => { + tokens.combine("e! { result__ as *mut _ as *mut _, }); + } + SignatureKind::Query(query) | SignatureKind::QueryOptional(query) if query.guid == position => { + tokens.combine("e! { &::IID, }); + } + _ => { + let name = self.param_name(param.def); + if let ArrayInfo::Fixed(fixed) = param.array_info { + if fixed > 0 && self.reader.param_free_with(param.def).is_none() { + let signature = if self.reader.param_flags(param.def).output() { + quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } + } else { + quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } + }; + + tokens.combine(&signature); + continue; + } + } + if let ArrayInfo::RelativeLen(_) = param.array_info { + let signature = if self.reader.param_flags(param.def).output() { + quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } + } else { + quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } + }; - if self.reader.signature_param_is_convertible(param) { - tokens.combine("e! { #name.into_param().abi(), }); - continue; + tokens.combine(&signature); + continue; + } + if let ArrayInfo::RelativePtr(relative) = param.array_info { + let name = self.param_name(params[relative].def); + tokens.combine("e! { #name.len() as _, }); + continue; + } + if self.reader.signature_param_is_convertible(param) { + tokens.combine("e! { #name.into_param().abi(), }); + continue; + } + tokens.combine("e! { ::core::mem::transmute(#name), }); + } } - - tokens.combine("e! { ::core::mem::transmute(#name), }); } tokens } - pub fn win32_params(&self, params: &[SignatureParam]) -> TokenStream { + pub fn win32_params(&self, params: &[SignatureParam], kind: SignatureKind) -> TokenStream { let mut tokens = quote! {}; for (position, param) in params.iter().enumerate() { + match kind { + SignatureKind::Query(query) | SignatureKind::QueryOptional(query) => { + if query.object == position || query.guid == position { + continue; + } + } + _ => {} + } + let name = self.param_name(param.def); if let ArrayInfo::Fixed(fixed) = param.array_info { @@ -973,7 +990,7 @@ impl<'a> Gen<'a> { let return_type = match signature_kind { SignatureKind::ReturnVoid => quote! {}, - SignatureKind::Query | SignatureKind::QueryOptional | SignatureKind::ResultVoid => quote! { -> ::windows::core::Result<()> }, + SignatureKind::Query(_) | SignatureKind::QueryOptional(_) | SignatureKind::ResultVoid => quote! { -> ::windows::core::Result<()> }, SignatureKind::ResultValue => { let return_type = signature.params[signature.params.len() - 1].ty.deref(); let return_type = self.type_name(&return_type); diff --git a/crates/libs/metadata/src/reader/mod.rs b/crates/libs/metadata/src/reader/mod.rs index 831dff866f..0c3097d2dd 100644 --- a/crates/libs/metadata/src/reader/mod.rs +++ b/crates/libs/metadata/src/reader/mod.rs @@ -68,10 +68,16 @@ pub enum InterfaceKind { Base, } -#[derive(PartialEq, Eq)] +#[derive(Copy, Clone, PartialEq, Eq)] +pub struct QueryPosition { + pub object: usize, + pub guid: usize, +} + +#[derive(Copy, Clone, PartialEq, Eq)] pub enum SignatureKind { - Query, - QueryOptional, + Query(QueryPosition), + QueryOptional(QueryPosition), ResultValue, ResultVoid, ReturnStruct, @@ -1165,14 +1171,13 @@ impl<'a> Reader<'a> { match return_type { Type::HRESULT => { if signature.params.len() >= 2 { - let guid = &signature.params[signature.params.len() - 2]; - let object = &signature.params[signature.params.len() - 1]; - - if guid.ty == Type::ConstPtr((Box::new(Type::GUID), 1)) && !self.param_flags(guid.def).output() && object.ty == Type::MutPtr((Box::new(Type::Void), 2)) && self.param_is_com_out_ptr(object.def) { - if self.param_flags(object.def).optional() { - return SignatureKind::QueryOptional; - } else { - return SignatureKind::Query; + if let Some(guid) = self.signature_param_is_query_guid(&signature.params) { + if let Some(object) = self.signature_param_is_query_object(&signature.params) { + if self.param_flags(signature.params[object].def).optional() { + return SignatureKind::QueryOptional(QueryPosition { object, guid }); + } else { + return SignatureKind::Query(QueryPosition { object, guid }); + } } } } @@ -1200,6 +1205,22 @@ impl<'a> Reader<'a> { SignatureKind::ReturnVoid } + fn signature_param_is_query_guid(&self, params: &[SignatureParam]) -> Option { + for pos in (0..params.len()).rev() { + if params[pos].ty == Type::ConstPtr((Box::new(Type::GUID), 1)) && !self.param_flags(params[pos].def).output() { + return Some(pos); + } + } + None + } + fn signature_param_is_query_object(&self, params: &[SignatureParam]) -> Option { + for pos in (0..params.len()).rev() { + if params[pos].ty == Type::MutPtr((Box::new(Type::Void), 2)) && self.param_is_com_out_ptr(params[pos].def) { + return Some(pos); + } + } + None + } // // Other type queries diff --git a/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs b/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs index 307ba94e8c..0b2aee863a 100644 --- a/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs @@ -1207,8 +1207,8 @@ impl IDxcExtraOutputs { ::core::mem::transmute((::windows::core::Interface::vtable(self).GetOutputCount)(::windows::core::Interface::as_raw(self))) } #[doc = "*Required features: `\"Win32_Graphics_Direct3D_Dxc\"`*"] - pub unsafe fn GetOutput(&self, uindex: u32, iid: *const ::windows::core::GUID, ppvobject: *mut *mut ::core::ffi::c_void, ppoutputtype: *mut ::core::option::Option, ppoutputname: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(uindex), ::core::mem::transmute(iid), ::core::mem::transmute(ppvobject), ::core::mem::transmute(ppoutputtype), ::core::mem::transmute(ppoutputname)).ok() + pub unsafe fn GetOutput(&self, uindex: u32, ppoutputtype: *mut ::core::option::Option, ppoutputname: *mut ::core::option::Option, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(uindex), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(ppoutputtype), ::core::mem::transmute(ppoutputname)).ok() } } impl ::core::convert::From for ::windows::core::IUnknown { @@ -1964,8 +1964,8 @@ impl IDxcResult { ::core::mem::transmute((::windows::core::Interface::vtable(self).HasOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(dxcoutkind))) } #[doc = "*Required features: `\"Win32_Graphics_Direct3D_Dxc\"`*"] - pub unsafe fn GetOutput(&self, dxcoutkind: DXC_OUT_KIND, iid: *const ::windows::core::GUID, ppvobject: *mut *mut ::core::ffi::c_void, ppoutputname: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(dxcoutkind), ::core::mem::transmute(iid), ::core::mem::transmute(ppvobject), ::core::mem::transmute(ppoutputname)).ok() + pub unsafe fn GetOutput(&self, dxcoutkind: DXC_OUT_KIND, ppoutputname: *mut ::core::option::Option, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(dxcoutkind), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(ppoutputname)).ok() } #[doc = "*Required features: `\"Win32_Graphics_Direct3D_Dxc\"`*"] pub unsafe fn GetNumOutputs(&self) -> u32 { diff --git a/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs b/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs index 2cfe519ca2..7db7263aec 100644 --- a/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs @@ -750,8 +750,8 @@ impl IDirectManipulationContent { (::windows::core::Interface::vtable(self).GetViewport)(::windows::core::Interface::as_raw(self), &::IID, &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] - pub unsafe fn GetTag(&self, riid: *const ::windows::core::GUID, object: *mut *mut ::core::ffi::c_void, id: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(object), ::core::mem::transmute(id)).ok() + pub unsafe fn GetTag(&self, id: *mut u32, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(id)).ok() } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] pub unsafe fn SetTag<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>>(&self, object: Param0, id: u32) -> ::windows::core::Result<()> { @@ -1730,8 +1730,8 @@ impl IDirectManipulationViewport { (::windows::core::Interface::vtable(self).GetStatus)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(result__.as_mut_ptr())).from_abi::(result__) } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] - pub unsafe fn GetTag(&self, riid: *const ::windows::core::GUID, object: *mut *mut ::core::ffi::c_void, id: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(object), ::core::mem::transmute(id)).ok() + pub unsafe fn GetTag(&self, id: *mut u32, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(id)).ok() } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] pub unsafe fn SetTag<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>>(&self, object: Param0, id: u32) -> ::windows::core::Result<()> { @@ -1940,8 +1940,8 @@ impl IDirectManipulationViewport2 { (::windows::core::Interface::vtable(self).base__.GetStatus)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(result__.as_mut_ptr())).from_abi::(result__) } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] - pub unsafe fn GetTag(&self, riid: *const ::windows::core::GUID, object: *mut *mut ::core::ffi::c_void, id: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).base__.GetTag)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(object), ::core::mem::transmute(id)).ok() + pub unsafe fn GetTag(&self, id: *mut u32, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).base__.GetTag)(::windows::core::Interface::as_raw(self), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(id)).ok() } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] pub unsafe fn SetTag<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>>(&self, object: Param0, id: u32) -> ::windows::core::Result<()> { diff --git a/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs b/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs index dbcc3dcf9c..8f311dc6a6 100644 --- a/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs @@ -10376,8 +10376,9 @@ impl IDXGISurface2 { (::windows::core::Interface::vtable(self).base__.ReleaseDC)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(pdirtyrect)).ok() } #[doc = "*Required features: `\"Win32_Graphics_Dxgi\"`*"] - pub unsafe fn GetResource(&self, riid: *const ::windows::core::GUID, ppparentresource: *mut *mut ::core::ffi::c_void, psubresourceindex: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetResource)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(ppparentresource), ::core::mem::transmute(psubresourceindex)).ok() + pub unsafe fn GetResource(&self, psubresourceindex: *mut u32) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).GetResource)(::windows::core::Interface::as_raw(self), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(psubresourceindex)).and_some(result__) } } impl ::core::convert::From for ::windows::core::IUnknown { diff --git a/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs b/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs index 3f911f5b0b..0983fe5c11 100644 --- a/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs @@ -6391,8 +6391,9 @@ pub struct IMMDevice(::windows::core::IUnknown); impl IMMDevice { #[doc = "*Required features: `\"Win32_Media_Audio\"`, `\"Win32_Foundation\"`, `\"Win32_System_Com_StructuredStorage\"`*"] #[cfg(all(feature = "Win32_Foundation", feature = "Win32_System_Com_StructuredStorage"))] - pub unsafe fn Activate(&self, iid: *const ::windows::core::GUID, dwclsctx: super::super::System::Com::CLSCTX, pactivationparams: *const super::super::System::Com::StructuredStorage::PROPVARIANT, ppinterface: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).Activate)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(iid), ::core::mem::transmute(dwclsctx), ::core::mem::transmute(pactivationparams), ::core::mem::transmute(ppinterface)).ok() + pub unsafe fn Activate(&self, dwclsctx: super::super::System::Com::CLSCTX, pactivationparams: *const super::super::System::Com::StructuredStorage::PROPVARIANT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).Activate)(::windows::core::Interface::as_raw(self), &::IID, ::core::mem::transmute(dwclsctx), ::core::mem::transmute(pactivationparams), &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_Media_Audio\"`, `\"Win32_System_Com_StructuredStorage\"`, `\"Win32_UI_Shell_PropertiesSystem\"`*"] #[cfg(all(feature = "Win32_System_Com_StructuredStorage", feature = "Win32_UI_Shell_PropertiesSystem"))] diff --git a/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs b/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs index ff102d058a..cc4ec8b2fb 100644 --- a/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs @@ -7388,14 +7388,15 @@ pub unsafe fn DebugCreate() -> ::windows::core::R } #[doc = "*Required features: `\"Win32_System_Diagnostics_Debug\"`*"] #[inline] -pub unsafe fn DebugCreateEx(interfaceid: *const ::windows::core::GUID, dbgengoptions: u32, interface: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { +pub unsafe fn DebugCreateEx(dbgengoptions: u32) -> ::windows::core::Result { #[cfg(windows)] { #[link(name = "windows")] extern "system" { fn DebugCreateEx(interfaceid: *const ::windows::core::GUID, dbgengoptions: u32, interface: *mut *mut ::core::ffi::c_void) -> ::windows::core::HRESULT; } - DebugCreateEx(::core::mem::transmute(interfaceid), ::core::mem::transmute(dbgengoptions), ::core::mem::transmute(interface)).ok() + let mut result__ = ::core::option::Option::None; + DebugCreateEx(&::IID, ::core::mem::transmute(dbgengoptions), &mut result__ as *mut _ as *mut _).and_some(result__) } #[cfg(not(windows))] unimplemented!("Unsupported target OS"); diff --git a/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs b/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs index 9fefbcacf0..f10fe258a8 100644 --- a/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs @@ -1707,8 +1707,9 @@ impl IClassFactory2 { } #[doc = "*Required features: `\"Win32_System_Ole\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn CreateInstanceLic<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param1: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>>(&self, punkouter: Param0, punkreserved: Param1, riid: *const ::windows::core::GUID, bstrkey: Param3, ppvobj: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).CreateInstanceLic)(::windows::core::Interface::as_raw(self), punkouter.into_param().abi(), punkreserved.into_param().abi(), ::core::mem::transmute(riid), bstrkey.into_param().abi(), ::core::mem::transmute(ppvobj)).ok() + pub unsafe fn CreateInstanceLic<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param1: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, T: ::windows::core::Interface>(&self, punkouter: Param0, punkreserved: Param1, bstrkey: Param3) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).CreateInstanceLic)(::windows::core::Interface::as_raw(self), punkouter.into_param().abi(), punkreserved.into_param().abi(), &::IID, bstrkey.into_param().abi(), &mut result__ as *mut _ as *mut _).and_some(result__) } } #[cfg(feature = "Win32_System_Com")] diff --git a/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs b/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs index c782bd3ee0..5aa6f1135f 100644 --- a/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs @@ -84,8 +84,9 @@ pub struct ICompositionDrawingSurfaceInterop(::windows::core::IUnknown); impl ICompositionDrawingSurfaceInterop { #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, iid: *const ::windows::core::GUID, updateobject: *mut *mut ::core::ffi::c_void, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), ::core::mem::transmute(iid), ::core::mem::transmute(updateobject), ::core::mem::transmute(updateoffset)).ok() + pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(updateoffset)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`*"] pub unsafe fn EndDraw(&self) -> ::windows::core::Result<()> { @@ -176,8 +177,9 @@ pub struct ICompositionDrawingSurfaceInterop2(::windows::core::IUnknown); impl ICompositionDrawingSurfaceInterop2 { #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, iid: *const ::windows::core::GUID, updateobject: *mut *mut ::core::ffi::c_void, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).base__.BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), ::core::mem::transmute(iid), ::core::mem::transmute(updateobject), ::core::mem::transmute(updateoffset)).ok() + pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).base__.BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(updateoffset)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`*"] pub unsafe fn EndDraw(&self) -> ::windows::core::Result<()> { diff --git a/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs b/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs index 7c5c3ca3fb..26284b80e1 100644 --- a/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs @@ -708,8 +708,9 @@ impl ISurfaceImageSourceNativeWithD2D { } #[doc = "*Required features: `\"Win32_System_WinRT_Xaml\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, iid: *const ::windows::core::GUID, updateobject: *mut *mut ::core::ffi::c_void, offset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), ::core::mem::transmute(iid), ::core::mem::transmute(updateobject), ::core::mem::transmute(offset)).ok() + pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, offset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(offset)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_WinRT_Xaml\"`*"] pub unsafe fn EndDraw(&self) -> ::windows::core::Result<()> { diff --git a/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs b/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs index 9029b5bc67..74ee6fb222 100644 --- a/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs @@ -5313,8 +5313,9 @@ pub struct IWbemClientConnectionTransport(::windows::core::IUnknown); impl IWbemClientConnectionTransport { #[doc = "*Required features: `\"Win32_System_Wmi\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn Open<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param4: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param5: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param6: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param8: ::windows::core::IntoParam<'a, IWbemContext>>(&self, straddresstype: Param0, abbinaryaddress: &[u8], strobject: Param3, struser: Param4, strpassword: Param5, strlocale: Param6, lflags: i32, pctx: Param8, riid: *const ::windows::core::GUID, pinterface: *mut *mut ::core::ffi::c_void, pcallres: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).Open)(::windows::core::Interface::as_raw(self), straddresstype.into_param().abi(), abbinaryaddress.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(abbinaryaddress)), strobject.into_param().abi(), struser.into_param().abi(), strpassword.into_param().abi(), strlocale.into_param().abi(), ::core::mem::transmute(lflags), pctx.into_param().abi(), ::core::mem::transmute(riid), ::core::mem::transmute(pinterface), ::core::mem::transmute(pcallres)).ok() + pub unsafe fn Open<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param4: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param5: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param6: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param8: ::windows::core::IntoParam<'a, IWbemContext>, T: ::windows::core::Interface>(&self, straddresstype: Param0, abbinaryaddress: &[u8], strobject: Param3, struser: Param4, strpassword: Param5, strlocale: Param6, lflags: i32, pctx: Param8, pcallres: *mut ::core::option::Option) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).Open)(::windows::core::Interface::as_raw(self), straddresstype.into_param().abi(), abbinaryaddress.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(abbinaryaddress)), strobject.into_param().abi(), struser.into_param().abi(), strpassword.into_param().abi(), strlocale.into_param().abi(), ::core::mem::transmute(lflags), pctx.into_param().abi(), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(pcallres)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_Wmi\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] diff --git a/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs b/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs index 36cb91f84b..b26ae5c7a2 100644 --- a/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs @@ -38866,8 +38866,9 @@ impl IShellFolder { } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_Foundation\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(all(feature = "Win32_Foundation", feature = "Win32_UI_Shell_Common"))] - pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], riid: *const ::windows::core::GUID, rgfreserved: *mut u32, ppv: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), ::core::mem::transmute(riid), ::core::mem::transmute(rgfreserved), ::core::mem::transmute(ppv)).ok() + pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>, T: ::windows::core::Interface>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], rgfreserved: *mut u32) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), &::IID, ::core::mem::transmute(rgfreserved), &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(feature = "Win32_UI_Shell_Common")] @@ -39011,8 +39012,9 @@ impl IShellFolder2 { } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_Foundation\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(all(feature = "Win32_Foundation", feature = "Win32_UI_Shell_Common"))] - pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], riid: *const ::windows::core::GUID, rgfreserved: *mut u32, ppv: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).base__.GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), ::core::mem::transmute(riid), ::core::mem::transmute(rgfreserved), ::core::mem::transmute(ppv)).ok() + pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>, T: ::windows::core::Interface>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], rgfreserved: *mut u32) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).base__.GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), &::IID, ::core::mem::transmute(rgfreserved), &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(feature = "Win32_UI_Shell_Common")] diff --git a/crates/tests/query_signature/Cargo.toml b/crates/tests/query_signature/Cargo.toml new file mode 100644 index 0000000000..5a8ad6ac26 --- /dev/null +++ b/crates/tests/query_signature/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "test_query_signature" +version = "0.0.0" +authors = ["Microsoft"] +edition = "2018" + +[dependencies.windows] +path = "../../libs/windows" +features = [ + "Win32_System_Diagnostics_Debug", +] diff --git a/crates/tests/query_signature/src/lib.rs b/crates/tests/query_signature/src/lib.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/crates/tests/query_signature/src/lib.rs @@ -0,0 +1 @@ + diff --git a/crates/tests/query_signature/tests/test.rs b/crates/tests/query_signature/tests/test.rs new file mode 100644 index 0000000000..7ed48166a5 --- /dev/null +++ b/crates/tests/query_signature/tests/test.rs @@ -0,0 +1,8 @@ +use windows::Win32::System::Diagnostics::Debug::*; + +#[test] +fn test() { + unsafe { + let _debug: IDebugClient = DebugCreateEx(0).unwrap(); + } +}