使用 IDispatch::Invoke 的 OLE 交互参数构造

Parameters construction for OLE interaction using IDispatch::Invoke

我正在学习Microsoft article about OLE automation。据我了解AutoWrap函数是用来调用外部方法的,get/set属性。

让我们尝试理解调用此函数的代码:

//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;

看起来像位掩码。

  1. x.lVal = 1; - 这意味着我们将整数 1 传递给 Visible 函数。但是每种类型的参数必须使用哪些属性?我在文章中看到了"lVal"和"bstrVal"。对于数组参数,它是 "parray":
VARIANT arr;
//...
arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);

如果我们需要调用一个带有多个参数的函数比如:MyFun(x y),我们需要以相反的顺序传递它们:

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. 我的调查是否正确?

至于某些随机方法所需的参数,您需要查看该特定调用的文档,或者如果它不是文档化的接口,则需要查看类型库。并意识到大多数 COM 对象实现双接口,这对 C++ 来说更容易处理(双接口允许 IDispatch 后期绑定以及常规早期绑定,所有类型检查可用于任何函数调用)。

VARENUM 类型的文档告诉您需要为任何给定的 VT_ 值设置 VARIANT 的哪个成员。