我正在尝试调用 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,
)
};
问题在于将 ByRef 标志添加到 Invoke 调用中。它应该只是 DISPATCH_METHOD。
其他困难是: