com_shim/
utils.rs

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; // en
16        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(); // https://stackoverflow.com/a/65255739
25    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}