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