1use windows::{
2 Win32::System::{Com::*, Ole::*, Variant::*},
3 core::*,
4};
5
6pub(crate) fn get_method_dispid<S>(disp: &IDispatch, name: S) -> Result<i32>
7where
8 S: AsRef<str>,
9{
10 unsafe {
11 let riid = GUID::zeroed();
12 let hstring = HSTRING::from(name.as_ref());
13 let rgsznames = PCWSTR::from_raw(hstring.as_ptr());
14 let cnames = 1;
15 let lcid = 0x09; let mut dispidmember = 0;
17
18 disp.GetIDsOfNames(&riid, &rgsznames, cnames, lcid, &mut dispidmember)?;
19 Ok(dispidmember)
20 }
21}
22
23pub(crate) fn assemble_dispparams_get(args: &mut Vec<VARIANT>) -> DISPPARAMS {
24 args.reverse(); DISPPARAMS {
26 rgvarg: args.as_mut_ptr(),
27 cArgs: args.len() as u32,
28 ..Default::default()
29 }
30}
31
32static PUT_NAMED_ARGS: [i32; 1] = [DISPID_PROPERTYPUT];
33
34pub(crate) fn assemble_dispparams_put(args: &mut Vec<VARIANT>) -> DISPPARAMS {
35 DISPPARAMS {
36 rgvarg: args.as_mut_ptr(),
37 cArgs: args.len() as u32,
38 cNamedArgs: PUT_NAMED_ARGS.len() as u32,
39 rgdispidNamedArgs: PUT_NAMED_ARGS.as_ptr().cast_mut(),
40 }
41}