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

时间:2018-05-17 05:41:16

标签: c++ windows com ole

我正在结束Microsoft article about OLE automation。据我所知,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?可能它表示论证的类型。当他们将数组作为参数传递时,他们会写下:
  2. VARIANT arr;
    arr.vt = VT_ARRAY | VT_VARIANT;
    

    看起来有点面具。

    1. x.lVal = 1; - 这意味着我们将整数1传递给Visible函数。但是每种类型的参数必须使用哪些属性?我看到了" lVal"和" bstrVal"在文章中。对于数组参数,它是" parray":
    2. 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. 我的调查是否正确?

1 个答案:

答案 0 :(得分:1)

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

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