Построение параметров для взаимодействия OLE с использованием IDispatch :: Invoke - PullRequest
0 голосов
/ 17 мая 2018

Я изучаю Статья Microsoft об автоматизации OLE .Насколько я понимаю, функция AutoWrap используется для вызова внешних методов, получения / установки свойств.

Давайте попробуем понять код, вызывающий эту функцию:

//Make it visible (i.e. app.visible = 1)
{
    //parameter preparation
    VARIANT x;
    x.vt = VT_I4;// type of parameter
    x.lVal = 1;// value

    AutoWrap(
        DISPATCH_PROPERTYPUT, // set property
        NULL, // we need no result
        pXlApp,// pointer to Excel app
        L"Visible",// "Visible" property
        1,// 1 argument passed
        x//passed argument
        );
}

Что я не понимаютакое структура x:

  1. Что такое x.vt = VT_I4?Вероятно, это обозначает тип аргумента.Когда они передают массив в качестве параметра, они записывают это:
VARIANT arr;
arr.vt = VT_ARRAY | VT_VARIANT;

Похоже на битовую маску.

x.lVal = 1; - это означает, что мы передаем целое число 1 в функцию Visible.Но какие свойства должны использоваться для каждого типа аргумента?Я видел "lVal" и "bstrVal" в статье.Для параметра массива это "parray":
VARIANT arr;
//...
arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);

Если нам нужно вызвать функцию с несколькими параметрами, скажем: MyFun (xy), нам нужно передать их в обратном порядке:

VARIANT x;
x.vt = VT_I4;
x.lVal = 1;

VARIANT y;
x.vt = VT_I4;
x.lVal = 2;

AutoWrap(
    DISPATCH_METHOD, NULL, pXlApp, L"MyFun", 2, y, x
    );
  1. Где я могу найти правила построения параметров для любого вызова функции?

  2. Я прав в своих исследованиях?

1 Ответ

0 голосов
/ 17 мая 2018

Что касается параметров, ожидаемых каким-либо случайным методом, вам нужно будет просмотреть документы для этого конкретного вызова или библиотеку типов, если это не документированный интерфейс. И поймите, что большинство объектов COM реализуют двойные интерфейсы, с которыми C ++ гораздо проще иметь дело (двойные интерфейсы позволяют как позднюю привязку IDispatch, так и регулярную раннюю привязку со всей проверкой типа, доступной для любого вызова функции).

Документы для типа VARENUM говорят о том, какой элемент VARIANT необходимо установить для любого заданного значения VT_.

...