Я пытаюсь вызвать метод Move для объекта Outlook MailItem Dispatch, и мне нужно предоставить MAPIFolder в качестве аргумента.
Я могу вызывать/получать другие методы/свойства, которые не требуют никаких аргументов, но все попытки предоставить аргументы приводили к различным ошибкам.
Из их GUID я знаю, что электронная почта — это _MailItem, а папка — MAPIFolder.
Я также могу получить Dispid _MailItem.Move.
Судя по документации, 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,
)
};
@DmitryStrebleченко Я считаю, что ВАРИАНТ, созданный из отправки папки, должен иметь vt 9, так что vt_dispatch? Должно ли это быть vt_variant? В документах Outlook по этому поводу нет ясности.
vt_dispatch должно быть хорошо. Вы уверены, что папка не пустая?
@ДмитриСтреблеченко Да. Я могу получить его свойство Name и его GUID.
Как вы думаете, почему Mover нужны именованные аргументы, а не обычные аргументы? У вас другая ошибка?
Давайте продолжим обсуждение в чате.
Я бы предпочел продолжить обсуждение здесь для пользы других разработчиков...
@DmitryStreblekova Моя вина. Я думал, что чат общедоступен, и просто последовал совету SO. Я думал, что ошибка использования позиционных аргументов была «Отсутствует аргумент», но на самом деле это было HRESULT (0x80020005), что означает несоответствие типа disp. Итак, я был неправ, но не знаю, почему я получаю несоответствие.

Проблема заключалась в добавлении флага ByRef к вызову Invoke. Это должен был быть только DISPATCH_METHOD.
Другими трудностями были:
Каков тип варианта аргумента? Это vt_dispatch? Или vt_variant?