我正在结束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的结构:
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(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
);
在哪里可以找到任何函数调用的参数构造规则?
我的调查是否正确?
答案 0 :(得分:1)
对于某些随机方法所期望的参数,您需要查看该特定调用的文档,或者如果它不是文档化的接口,则需要查看类型库。并且意识到大多数COM对象实现了双接口,这使得C ++更容易处理(双接口允许IDispatch后期绑定以及常规早期绑定以及任何函数调用可用的所有类型检查)。
VARENUM类型的文档告诉您需要为任何给定的VT_值设置VARIANT的成员。