使用 windows-rs 将参数传递给 Rust 中的 COM Dispatch 上的方法

问题描述 投票:0回答:1

我正在尝试调用 Outlook MailItem Dispatch 对象上的 Move 方法,并且需要提供 MAPIFolder 作为参数。

我能够调用/获取其他不需要任何参数的方法/属性,但所有提供参数的尝试都导致了各种错误。

从他们的 GUID 中我知道电子邮件是 _MailItem,文件夹是 MAPIFolder。

我还可以检索 _MailItem.Move 的 dispid。

从文档来看,Move 应该采用单个 MAPIFolder 作为参数。

此示例导致 HRESULT 0x80020009,这是“异常”,描述是“属性是只读的”。我不知道这指的是哪个对象的哪个属性。

let email : IDispatch = ...;
let folder : IDispatch = ...;

let args = vec![VARIANT::from(folder)];

let dispparams = DISPPARAMS {
    rgvarg : args.as_mut_ptr() as *mut VARIANT,
    rgdispidNamedArgs : null_mut() as *mut i32,
    cArgs : 1,
    cNamedArgs : 0,
};

let mut result = EXCEPINFO::default();
let mut exception = VARIANT::new();

unsafe {
email.Invoke(
    move_dispid, // Method ID
    &GUID::zeroed(), // reserved
    LOCALE_USER_DEFAULT, // constant, 0x0400
    0x01 | 0x08, // constant, Method | ByRef
    &dispparams as *const DISPPARAMS,
    Some(&mut result as *mut VARIANT),
    Some(&mut exception as *mut EXCEPINFO),
    None,
)
};
rust outlook com windows-rs
1个回答
0
投票

问题在于将 ByRef 标志添加到 Invoke 调用中。它应该只是 DISPATCH_METHOD。

其他困难是:

  • 通过初始化 IUnknown 并将其转换为 IDispatch 来检索 Application Dispatch 对象。这导致了随机异常,直接初始化为 IDispatch 时不会发生。
  • 尝试使用命名参数而不是位置参数。似乎大多数函数只使用位置参数。
© www.soinside.com 2019 - 2024. All rights reserved.